在後臺用Lambda查實體的時候報的數據庫錯誤,在網上找到這個解決方法https://www.cnblogs.com/jxldjsn/p/8108141.html;但是不適用我的場景。
問題
OrderParentService orderParentService = new OrderParentService();
OrderItemService orderItemService = new OrderItemService();
var platform = Platform.Amazon.ToString();
var datetime= DateTime.Now.AddMonths(-1);
//訂單列表
var orderParentList = orderParentService.FindAll(p => p.PLATFORM == platform && p.ORDER_INSERT_DATE >= datetime).Select(p => p.ORDER_ID).Tolist();
//訂單詳情
var orderItemList = orderItemService.FindAll(p => orderParentList.Contains(p.ORDER_ID) && p.ASIN == null);
通過問同事最後發現是包含函數Contains的問題,當訂單列表Tolist之後使用Contains會自動轉換成In的查詢方式,當ID超過兩千條就會報錯
解決
通過把兩個實體放到同一個上下文
關鍵字 ObjContext
OrderParentService orderParentService = new OrderParentService();
var op = orderParentService.ObjContext;
OrderItemService orderItemService = new OrderItemService();
orderItemService.ObjContext = op;
var platform = Platform.Amazon.ToString();
var datetime= DateTime.Now.AddMonths(-1);
//訂單列表
var orderParentList = orderParentService.FindAll(p => p.PLATFORM == platform && p.ORDER_INSERT_DATE >= datetime).Select(p => p.ORDER_ID);
//訂單詳情
var orderItemList = orderItemService.FindAll(p => orderParentList.Contains(p.ORDER_ID) && p.ASIN == null);
再多說一句:在linq中不能直接把時間拼上去!!!比如這種 一定會報錯的!!!只能放變量,把時間放在語句外賦值(都是踩過的坑...)
var orderParentList = orderParentService.FindAll(p => p.PLATFORM == platform && p.ORDER_INSERT_DATE >= DateTime.Now.AddMonths(-1)).Select(p => p.ORDER_ID);