我的程序里有這么一段代碼:
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();
GetCustomerContactInfoModelFromPO和GetShopContactInfoModelFromPO定義很簡單,你懂的。
結果,在運行時,文章標題提到的異常出現了:
“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); }
不過,像我這種情況,無法復用的話,還真是談不上簡潔性了。不曉得還有沒有什么好的解決辦法...