有多重排序的需求,該怎麼作?
.OrderBy(x => new {
x.PROGRAM_CODE, x.LITERACY_CODE }).ToList();
提升寫入速度
利用foreach新增多筆資料或刪除多筆資料時,將多筆資料塞到一個 list中,再利用RemoveRange()方法處理。同時不要每一筆紀錄就執行一次 savechange()。
也有人建議將偵測異動屬性關閉,但這樣會抓不到savechange筆數
dbContext.Configuration.AutoDetectChangesEnabled = false;
要追求極致效能,使用手寫sql等技巧,有以下的討論:
https://www.thereformedprogrammer.net/entity-framework-core-performance-tuning-a-worked-example/
Entity framework 要如何 left join?
(LINQ LEFT JOIN where clause)
此處的情境假設有個db實體為XEntities,主要表格為PROGRAMs,join SCHOOLs、PROGRAM_TYPE兩個表格。要找出 PLAN_FILL_RECORD 有沒有填寫紀錄。
因為 PLAN_FILL_RECORD 要指定只抓某年度的紀錄,因此年度的條件是放在 join 該行的 where 敘述中。若放在 on 的敘述,會變成 inner join。
此外,PLAN_FILL_RECORD 不一定有值,所以在on 之後會讓查詢結果加上一個 into 敘述(黃色部分),將以上的查詢結果帶到
pRes 之中。
接下來再用 from .... in pRes.DefaultIfEmpty() 的語法查詢結果,這樣有結果則顯示資料,沒結果則帶出 left join資料表的欄位預設值。
最後用欄位投影方式,處理欄位有null時如何顯示。這裡為了讓資料維持強型別,定義了一個 OBJECT_SHOW物件來接收資料。
var query2 = (
from b in
XEntities.PROGRAMs
join e in
XEntities.SCHOOLs
on b.SCHOOL_NO equals e.SCHOOL_NO
join p in
XEntities.PROGRAM_TYPE
on b.PROGRAM_TYPE equals p.PROGRAM_CODE
join plan in
XEntities.PLAN_FILL_RECORD.
Where(o => o.STANDARD_YEAR == cyear)
on b.PROGRAM_ID equals plan.PROGRAM_ID
into pRes
from res in pRes.DefaultIfEmpty()
select new OBJECT_SHOW()
{
SCHOOL_NO = b.SCHOOL_NO,
//..................
PROOF2 = res == null ? "" : res.PROOF2,
REPLY_DOCU_NO = res == null ? "" : res.REPLY_DOCU_NO
})
.ToList();
[
參考1]
Entity framework 要如何撰寫像sql 一樣的where colunm in ('a','b','c')?
List<string>
optionList = new List<string>();
optionList.Add("IN03");
optionList.Add("IN19");
using(Entities db = new Entities()){
var Query1 = from a in db.ISSUEs
where (
optionList.
Contains(a.ISSUE_CODE.ToString()))
select a;
foreach (ISSUE vi in Query1)
{
Response.Write(vi.ISSUE_NAME +"<br/>");
}
}
Entity framework 刪除失敗
使用EF異動資料 ,在更新之前 根据外键 我查询了 是否已经存在:
dbContext.model.Where(d => d.HotelId == hotelId).FirstOrDefault();
如果 存在 就更新, 不存在就Add;
存在 时 去 更新:
dbContext.Entry(model).State = EntityState.Modified;
dbContext.SaveChanges()
此时运行就会报错: Store update, insert, or delete statement affected an unexpected number of rows (0)
解决办法:
dbContext.model.Where(d => d.HotelId == hotelId).FirstOrDefault();
dbContext.Entry(mod).State = EntityState.Detached; // 查询完后 dbContext实体 内 已经存在了, 要设置为 detach ,然后再去更新
dbContext.Entry(model).State = EntityState.Modified;
dbContext.SaveChanges()
抓取 Entity framework 寫入時的Exception
try
{
CEntities.CURSE_QA.Add(QA);
CEntities.SaveChanges();
}
//將錯誤訊息顯示在頁面上
catch (System.Data.Entity.Validation.DbEntityValidationException Dx) {
string DbErrorList = "";
var qq = Dx.EntityValidationErrors;
foreach (var thisError in qq) {
foreach (var thisSubError in thisError.ValidationErrors)
{
DbErrorList = DbErrorList + thisSubError.ErrorMessage;
}
}
Literal1.Text = DbErrorList;
}
catch (Exception ex)
{
throw ex;
}