EntityFrameWork類庫,是微軟推出的ORM組件,它是基於Ado.Net的,個人感覺還是非常 好用的。以下介紹的2個功能點分別是部分字段更新和獲取
解決部分字段Update。本方案采用倉儲模式
步驟1:定義接口,實現倉庫基類

步驟2:實現接口

步驟3:定義DbContext對象

步驟4:創建Access對象

步驟5:調用
using (TestDbContext dbContext = new TestDbContext())
{
baunitAccess dbAccess = new baunitAccess(dbContext);
//使用部分更新(不推薦,10000條數據時,非常慢)
List<baunitBillModel> listModel = new List<baunitBillModel>();
listModel.Add(new baunitBillModel() { UnitCode = "U001", UnitName = "U0011" });
listModel.Add(new baunitBillModel() { UnitCode = "U002", UnitName = "U0022" });
listModel.Add(new baunitBillModel() { UnitCode = "U003", UnitName = "U0033" });
listModel.Add(new baunitBillModel() { UnitCode = "U004", UnitName = "U0044" });
foreach (baunitBillModel pModel in listModel)
{
ba_unit pEntity = pModel.ToEntity();
dbAccess.PartialUpdateNew(pEntity, pModel.UpdateColumnNames);
}
dbAccess.NoCheckSaveChanges();
////使用EF擴展(推薦)
//dbContext.ba_unit
// .Where(c => c.UnitCode == "U001")
// .Update(c => new ba_unit()
// {
// UnitName = "件2"
// });
//dbAccess.NoCheckSaveChanges();
}
是不是so easy!!!
下面再介紹另一個實用的功能,如果更新時,我們能夠動態的記錄類中哪些屬性有變化,只將有變化的屬性作為待更新字即可,實現起來也不復雜。代碼如下

看調用的代碼中,下面這個變量就是存儲哪些屬性有值變化的,是不是也很簡單?!!!
pModel.UpdateColumnNames
不過,在這里要強調下,使用部分字段更新方式,在性能上仍然存在缺陷。原因:在數據量多的時候,每次Update時,都要在內存中循環找數據匹配,提交數據多的時候,不推薦使用
推薦使用EF擴展類庫,就是上面代碼中第2種方案,這種方式是最接近Ado.Net方式
解決部分字段獲取
下面介紹幾種方法,只返回部分字段,就是使用Linq語法中的Select關鍵字
已知條件:創建一個SqlServer數據庫(其他類型數據庫均可),再創建ba_unit表,字段包括:UnitCode,UnitName,SortNo,Status
代碼如下所示
using (TestDbContext dbContext = new TestDbContext())
{
//(OK)方法1
//微軟原汁原味的寫法,推薦使用
var listUnitCode = dbContext.ba_unit.Select(c => c.UnitCode).ToList();
var listP1 = dbContext.ba_unit.Select(c => new { c.UnitCode, c.UnitName }).ToList();
System.Console.WriteLine("方法1,返回個數:" + listP1.Count());
//(OK)方法2
//也是微軟本身提供的方法,要求:Select中的類,不能是Db表的映射類,即:Select(c => new ba_unit())時會報錯
IQueryable<ba_unit> queryUnit2 = dbContext.ba_unit.AsQueryable();
List<baunitBillModel> listUnit2 = queryUnit2.Select(c => new baunitBillModel()
{
UnitCode = c.UnitCode,
UnitName = c.UnitName
}).ToList();
System.Console.WriteLine("方法2,返回個數:" + listUnit2.Count());
//(OK)方法3
//此方法看着比較另類,但也是能實現.需第三方類支持(最下面已提供下載)
//參考地址:http://blog.csdn.net/shiyaru1314/article/details/50473905
List<ba_unit> listUnit3 = new List<ba_unit>();
IQueryable<ba_unit> queryUnit3 = dbContext.ba_unit.AsQueryable();
var listP3 = queryUnit3.Where(c => c.UnitCode == "U001").Select("new (UnitCode, UnitName)").AsQueryable();
foreach (dynamic p in listP3)
{
string unitCode = p.UnitCode;
string unitName = p.UnitName;
listUnit3.Add(new ba_unit() { UnitCode = unitCode, UnitName = unitName });
}
System.Console.WriteLine("方法3,返回個數:" + listUnit3.Count());
//(OK)方法4
//此方法是在查找資料過程中找到的,實現的Linq語法拼入Sql語句的方式,對於習慣寫Sql的童鞋可以使用
var listUnit4 = dbContext.ba_unit.Where("SortNo = 1").OrderBy("UnitCode");
System.Console.WriteLine("方法4,返回個數:" + listUnit4.Count());
//(NO)方法5
//此方法和方法4一樣,區別是參數化查詢(目前此方法有問題,沒有拼入條件)
var listUnit5 = dbContext.ba_unit.Where("UnitCode = @UnitCode", new object[] { "U001" }).OrderBy("UnitCode");
System.Console.WriteLine("方法5,返回個數:" + listUnit5.Count());
//方法6
//這個方法,我覺得也很好用,就一並展示出來,好處是避免創建過多的Model類
//參考地址:http://www.cnblogs.com/sword-successful/p/3318540.html
DataTable dtUnit6 = new DataTable();
dtUnit6.Columns.Add("UnitCode", typeof(string));
dtUnit6.Columns.Add("UnitName", typeof(string));
dtUnit6.Rows.Add(new object[] { "U001", "U001Name" });
dtUnit6.Rows.Add(new object[] { "U002", "U002Name" });
dtUnit6.Rows.Add(new object[] { "U003", "U003Name" });
var listUnit6 = from p in dtUnit6.AsEnumerable()
select new
{
UnitCode = p["UnitCode"] as string,
UnitName = p["UnitName"] as string
};
System.Console.WriteLine("方法6,返回個數:" + listUnit6.Count());
foreach (var p in listUnit6)
{
System.Console.WriteLine(string.Format(" 子項->UnitCode:{0},UnitName:{1}", p.UnitCode, p.UnitName));
}
}
源碼下載方式
1,關注微信公眾號:小特工作室(也可直接掃描簽名處二維碼)
2,發送:示例4009
即可下載
