我的程序里有这么一段代码:

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);
}

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

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

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

    private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...

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

    var data = DataSource.Skip(iDisplayStart).Take(iDisplayLength).Select(o => new { MatNR = o.MatNR, ...

  3. Linq中字段数据类型转换问题(Linq to entity,LINQ to Entities 不识别方法"System.String ToString()"问题解决)

    1.在工作中碰到这样一个问题: 使用linq时,需要查询两个表,在这两张表中关联字段分别是int,和varchar()也就是string,在linq中对这两个字段进行关联, 如果强制类型转换两个不同类 ...

  4. Linq to Entities不识别方法

    db.UserValidates.Include(a => a.User).Where(uv => u.UserValidates.Contains(uv, c)).ToList(); 执 ...

  5. LINQ to Entities 不识别方法“System.DateTime AddDays(Double)

    今天本想在linq里按照时间筛选一下超时的数据,一共两个字段FeedBackTime(计划反馈时间).EndTime(实际反馈时间).需求是这样的,查找数据库里所有EndTime大于FeedBackT ...

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

    1.LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式.项目中发现linq to entities 不识别? , ...

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

    LINQ to Entities 不识别方法"System.Guid Parse(System.String)",因此该方法无法转换为存储表达式. linq 中不能转换类型

  8. LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式 的解决方法

    一.案例1,及解决方案: "LINQ to Entities 不识别方法"System.String ToString()",因此该方法无法转换为存储表达式." ...

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

    来源:https://www.cnblogs.com/hao-1234-1234/p/9112434.html 6  Select的时候,时间无法转换成 年月日  YYMMMdd 报错:LINQ to ...

随机推荐

  1. Zip压缩和解压缩

    这个功能完全依靠一个第三方的类,ICSharpCode.SharpZipLib.dll,只是在网上搜了大半天,都没有关于这个类的详细解释,搜索的demo也是各种错误,感觉作者完全没有跑过,就那么贸贸然 ...

  2. new出对象的作用

    new调用了构造函数以后 构造函数会返回一个对象的实例

  3. git 命令大全

    git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --glob ...

  4. java中double变量保留小数问题

    (转载自玄影池扁舟) 做java项目的时候可能经常会遇到double类型变量保留小数的问题,下面便把我的经验做个简短的总结: java中double类型变量保留小数问题大体分两种情况: (一):小数点 ...

  5. 禁止Visual Studio中的编译警告

    VC编译器有个很蛋痛的自家警告系统,默认下各种开源库比如CGAL,各种4996,而一般自己写的 如sscanf,fopen这种单个文件,在文件头加个 #pragma warning (disable ...

  6. JSON: Property 'xxx' has no getter method的解决办法

    在使用JSONArray.fromObject时候出现JSONException:Property 'xxx' has no getter method. 解决办法:设置bean为public属性即可 ...

  7. 天气预报API(五):城市代码--“新编码”和“旧编码” 对比

    参考一些博客.文章 来查找 测试 接口,后来发现两套城市编码标准,有点想法,故拿来对比分析. 注:新旧编码是个人主观叫法,只是为了方便称呼,可能有不当之处,请留言更正. 暂且称 中国天气网等网站使用的 ...

  8. TeamViewer11使用教程

    下载地址(官网):http://res.ncmem.com/download/TeamViewer11.exe 下载地址(360):https://yunpan.cn/cvxRiTfSC3iH6(访问 ...

  9. css样式重置,不建议用通配符

    由于各个浏览器对css样式的默认样式不一致,所以有必要进行样式重置.在网上看到很多建议使用 *{margin:0;padding:0} 重置margin和padding.建议不这样子使用,原因主要是性 ...

  10. Centos配置查看

    Reference: [1] http://www.centoscn.com/CentOS/help/2013/0928/1743.html [2] http://www.cnblogs.com/hi ...