【Oracle異常】ORA-03113: end-of-file on communication channel Process ID: 20191 Session ID

在後臺用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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章