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 中,使用lambada或linq时,变量一定要提前转换好,可不能到lambada里或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));

用lambada或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);
}

不过,像我这种情况,无法复用的话,还真是谈不上简洁性了。不晓得还有没有什么好的解决办法...

LINQ to Entities不识别方法***,因此该方法无法转换为存储表达式

时间: 2024-10-19 05:25:21

LINQ to Entities不识别方法***,因此该方法无法转换为存储表达式的相关文章

LINQ to Entities 不识别方法“System int string 转换的问题

这个问题困扰了挺久,网上找了挺多方法 都太好使. 分几种情况. 1.如果查询结果 转换,那比较容易. var q = from c in db.Customers where c.Country == "UK" || c.Country == "USA" select new { Phone = c.Phone, InternationalPhone = PhoneNumberConverter(c.Country, c.Phone) }; public strin

LINQ to Entities 不识别方法“System.String ToString() 的解决方法

今天在做一个页面的时候出现了LINQ to Entities 不识别方法"System.String ToString()"的错误,对于源码IQueryable<SelectListItem> items = roleInfoServer.Get(r => true).Select(r => new SelectListItem() { Value = r.Id.ToString(), Text = r.RoleName });找了好长的时间没有找到原因.无奈之

LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。解决

  问题描述 最近在用LINQ to Entities,看看下面的代码 //获取分页数据 var admins = from aa in db.VAccountAdmins select aa; //处理过滤规则 if (null != filterRules) { JArray roles = (JArray) JsonConvert.DeserializeObject(filterRules); foreach (var fr in roles) { string field = fr["f

LINQ to Entities 不识别方法 ...

今天遇到一个错误,记录一下,以备以后用到. System.NotSupportedException: LINQ to Entities 不识别方法“System.DateTime AddMinutes(Double)”,因此该方法无法转换为存储表达式. 导致错误的代码是这一句 其中在代码中使用了AddMinutes方法,不能被识别,解决办法, 在使用时调用一下Compile()方法转换一下即可. AsNoTracking()方法是阻止EF的默认缓存机制,在System.Data.Entity命

Linq to Entities不识别方法

db.UserValidates.Include(a => a.User).Where(uv => u.UserValidates.Contains(uv, c)).ToList(); 执行时出现:Linq to Entities不识别方法 解决方式可以使用lambda表达式树 Expression<Func<UserValidate, bool>> express = uv => u.UserValidates.Contains(uv, c); db.UserV

报错: LINQ to Entities 不识别方法&ldquo;Int32 Parse(System.String)

断点调试发现报错的语句为: public ActionResult SomeMethod(string someId) { var temp = SomeService.LoadEntities(a => a.ID == int.Parse(someId)); } 原因是:在Lambda表达式内部不能实现数据类型转换.解决方法:在使用Lambda表达式之前,先对数据类型进行转换. public ActionResult SomeMethod(string someId) { int tempIn

LinQ to entities 不能识别方法“system.string.ToString(system.String)”.因此该方法无法转换为存储表达式

[我也是刚研究IEnumerable和IQueryable]以下都是个人理解,仅供参考,如有错误欢迎指出~ 在EF里面,使用IQueryable和IEnumerable可以延迟加载. IQuerybale其实是微软针对SQLService进行了再度优化的一个产物.使用上基本和IEnumerable类似. 其实还是有一些使用上的区别的,比如说IEnumerable里面有count()方法,我们可以借此进行for循环.IQueryable却只能foreach循环. —————————————————

LINQ中in的实现方法-LINQ To Entities如何实现查询 select * from tableA where id in (1,2,3,4)

如果用in是字符串类型无问题,可以直接这样用 var result = SNFService.Instance.ModuleService.GetList(UserInfo).Where(entity => entity.DeletionStateCode == 0 ).Where(entity => urls.Contains((entity.NavigateUrl == null ? "" : entity.NavigateUrl).ToLower())).OrderB

linq to entity不识别方法"System.String ToString()"

将班级id以字符串形式输入如:"1111,1112,1113".数据库里的id为int型,在数据路里找到匹配的相应班级转换成列表.在这里爆出问题:不识别方法"System.String ToString()",跪求大神提出解决方案.public IEnumerable<Class1> FindClassesByIDs(string ids)        {            var r = from c in this.DbContext.Clas