LINQ to Entities不識別方法***,因此該方法無法轉換為存儲表達式


我的程序里有這么一段代碼:

order.OrderExpressInfo = (from oei in orderExpressRepository.Entities
                                      where oei.OrderId == order.OrderId
                                      select new EbcBuy.Bll.Orders.Models.OrderExpress
                                      {
                                          ContentInfo = oei.ContentInfo,
                                          CreatedTime = oei.CreatedTime,
                                          CreatedUserId = oei.CreatedUserId,
                                          ExpressId = oei.ExpressId,
                                          ExpressName = oei.ExpressName,
                                          ExpressOrderId = oei.ExpressOrderId,
                                          Freight = oei.Freight,
                                          Manifest = oei.Manifest,
                                          OrderId = oei.OrderId,
                                          ReceiverContactInfo = new ContactInfoModel() { ZipCode = oei.CustomerZipCode, Telephone = oei.CustomerPhone, MobilePhone = oei.CustomerTel, Address = oei.CustomerAddress, LinkMan = oei.CustomerReceiverName, ProvinceId = oei.CustomerArea.ProvinceId, ProvinceName = oei.CustomerArea.ProvinceName, CityId = oei.CustomerArea.CityId, CityName = oei.CustomerArea.CityName, CountyId = oei.CustomerArea.DistrictId, CountyName = oei.CustomerArea.DistrictName },
                                          ShopId = order.OrderId,
                                          ShopName = order.ShopName,
                                          ShopContactInfo = new ContactInfoModel() { ZipCode = oei.ShopZipCode, Telephone = oei.ShopTel, MobilePhone = oei.ShopPhone, Address = oei.ShopAddress, LinkMan = oei.ShopLinkMan, ProvinceId = oei.ShopArea.ProvinceId, ProvinceName = oei.ShopArea.ProvinceName, CityId = oei.ShopArea.CityId, CityName = oei.ShopArea.CityName, CountyId = oei.ShopArea.DistrictId, CountyName = oei.ShopArea.DistrictName }
                                      }).FirstOrDefault();

其中,ContactInfoModel是一個實體類,定義了買家或賣家的contact信息,  實體類 EbcBuy.Bll.Orders.Models.OrderExpress
具備兩個該類型的屬性, ReceiverContactInfo和ShopContactInfo。 這里使用linq to entity要給這2個屬性賦值, 要注意了,這里給ContactInfoModel初始化設置的屬性個數和順序必須相同。 否則,運行時會報如下異常:

“System.NotSupportedException”類型的未經處理的異常在 EntityFramework.dll 中發生
其他信息: 在單個 LINQ to Entities 查詢中的兩個結構上不兼容的初始化過程中出現類型“EbcBuy.Bll.Common.Models.ContactInfoModel”。類型可以在同一查詢中的兩個位置初始化,但前提是在這兩個位置設置了相同的屬性,且這些屬性是以相同的順序設置的。

 

 

我這個ContactInfoModel在項目里好多的linq to entity代碼里進行這樣的初始化, 為了提高復用,我把上面的初始化封裝成了一個方法, 供各處調用。 修改后的代碼如下:

 order.OrderExpressInfo = (from oei in orderExpressRepository.Entities
                                      where oei.OrderId == order.OrderId
                                      select new EbcBuy.Bll.Orders.Models.OrderExpress
                                      {
                                          ContentInfo = oei.ContentInfo,
                                          CreatedTime = oei.CreatedTime,
                                          CreatedUserId = oei.CreatedUserId,
                                          ExpressId = oei.ExpressId,
                                          ExpressName = oei.ExpressName,
                                          ExpressOrderId = oei.ExpressOrderId,
                                          Freight = oei.Freight,
                                          Manifest = oei.Manifest,
                                          OrderId = oei.OrderId,
                                          ReceiverContactInfo = GetCustomerContactInfoModelFromPO(oei),
                                          ShopId = order.OrderId,
                                          ShopName = order.ShopName,
                                          ShopContactInfo = GetShopContactInfoModelFromPO(oei)                                       }).FirstOrDefault();
GetCustomerContactInfoModelFromPOGetShopContactInfoModelFromPO定義很簡單,你懂的。
結果,在運行時,文章標題提到的異常出現了:
“System.NotSupportedException”類型的未經處理的異常在 EntityFramework.dll 中發生
其他信息: LINQ to Entities 不識別方法“EbcBuy.Bll.Common.Models.ContactInfoModel GetCustomerContactInfoModelFromPO(EbcBuy.Dal.Orders.Models.OrderInfo)”,因此該方法無法轉換為存儲表達式。

【園子里搜索了一下, 有如下結論】在LINQ to Entities 中,使用lambda或linq時,變量一定要提前轉換好,可不能到lambda里或linq里再轉換。如:

var o= _db.Dictionary.Where(x => x.Type.Equals(type4.ToString()));

.ToString必然產生錯誤,應該:

string t=type4.ToString();

var o= _db.Dictionary.Where(x => x.Type.Equals(t));

用lambda或linq時,不要嘗試去轉換內置類型,是不允許的,如:

string t=type4.ToString();

var o= _db.Dictionary.Where(x => Convert.ToString(x.Type).Equals(t));

Convert.ToString必然要出錯.

可以考慮使用如下方式:

using System.Data.Objects.SqlClient;  //在 System.Data.Entity.dll 中
//獲取市級地區
public JsonResult GetCity(string id)
{ 
    var city = from c in db.AreaDivide
    where SqlFunctions.StringConvert((double)c.ParentID) == id select new { text = c.AreaName, value = c.ID };

    return Json(city.ToList(), JsonRequestBehavior.AllowGet);
}

 

 

不過,像我這種情況,無法復用的話,還真是談不上簡潔性了。不曉得還有沒有什么好的解決辦法...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM