带有语句体的 lambda 表达式无法转换为 nopCommerce 中的表达式树 [重复]
Posted
技术标签:
【中文标题】带有语句体的 lambda 表达式无法转换为 nopCommerce 中的表达式树 [重复]【英文标题】:A lambda expression with a statement body cannot be converted to an expression tree in nopCommerce [duplicate] 【发布时间】:2013-08-08 08:58:19 【问题描述】:我尝试在 nopCommerce 3.0 中创建一个 linq 连接查询。我在 linq 中加入两个表并写入
代码成功。但视觉工作室智能显示错误,如
带有语句体的 lambda 表达式不能转换为表达式树
请看下面我的代码
var roles = _customerEventRoleRepository.Table.Where(c => c.EventId == selevent)
.Join
(
_customerRepository.Table,
cev => cev.CustomerId, c => c.Id,
(cev, c) =>
var cust = new CustomerEventRolesModel();
cust.Id = cev.Id;
cust.CustomerId = c.Id;
cust.Customer = c.Email;
cust.ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName);
cust.CompanyName = c.GetAttribute<string>(SystemCustomerAttributeNames.Company);
cust.Speaker = cev.IsSpeaker;
cust.Sponsor = cev.IsSponser;
return cust;
).OrderBy(cev => cev.Customer).ToList();
但错误显示
请帮忙
【问题讨论】:
你的 lambda 是一个函数。此函数无法转换为 SQL。你需要找到另一种方法来做你正在做的事情。 感谢您的宝贵回复。此处查询结果中需要 ContactName 和 CompanyName。 【参考方案1】:错误消息正是它所说的。你有一个 lambda 表达式。它有一个语句体。带有语句体的 lambda 表达式不能转换为表达式树。但是Join
需要一个表达式树才能与 EF 一起使用。您应该尝试用没有类似主体的 lambda 表达式替换您拥有的内容:
(cev, c) => new CustomerEventRolesModel
Id = cev.Id,
CustomerId = c.Id
等等。
顺便说一句,
ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName)
不适用于 EF。时期。你最好想点别的。
【讨论】:
感谢您的宝贵回复。我真的很抱歉先生。我不是一个有经验的人。如何在此查询结果中包含 ContactName 和 CompanyName。我认为需要更改添加 ContactName 和 CompanyName 字段的整个功能。 通过输入它们。模仿我对前两个属性所做的操作。 -1;以傲慢的短句重复错误消息的内容并添加全部大写不太可能帮助提问者理解为什么他的代码是非法的。特别是,这个答案没有解释什么是表达式树,EF 将它们用于什么,或者为什么编译器不能(或不愿意)进行使编译错误消失的琐碎重新排列(即将 lambda 主体提取到一个方法中,并使用对该方法的调用作为无主体 lambda 表达式的值。以上是关于带有语句体的 lambda 表达式无法转换为 nopCommerce 中的表达式树 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有内连接的 sql 查询转换为 linq lambda 表达式?
如何为CriteriaOperator过滤对象转换为lambda表达式,即:linq to xpo的动态where语句
如果不首先将 lambda 表达式转换为委托或表达式树类型,则无法将 lambda 表达式用作动态分派操作的参数