具有语句主体的lambda表达式无法转换为nopCommerce中的表达式树

Rag*_*h S 11 c# linq nopcommerce entity-framework-4 asp.net-mvc-3

我尝试在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();
Run Code Online (Sandbox Code Playgroud)

但错误显示

在此输入图像描述

请帮忙

jas*_*son -1

错误消息正是所说的。你有一个 lambda 表达式。它有一个声明体。带有语句体的 lambda 表达式无法转换为表达式树。但Join需要一个表达式树才能与 EF 一起使用。您应该尝试用没有主体的 lambda 表达式替换您所拥有的内容,例如:

(cev, c) => new CustomerEventRolesModel {
                Id = cev.Id,
                CustomerId = c.Id
            }
Run Code Online (Sandbox Code Playgroud)

等等。

顺便一提,

ContactName = c.GetAttribute<string>(SystemCustomerAttributeNames.FirstName)
Run Code Online (Sandbox Code Playgroud)

不适用于 EF。时期。你最好想出别的办法。

  • -1; 用居高临下的短句重复错误消息的内容并添加全部大写不太可能帮助询问者理解为什么他的代码是非法的。特别是,这个答案没有解释什么是表达式树,EF 使用它们的目的,或者为什么编译器不能(或不愿意做)使编译错误消失的微不足道的重新排列(这是将 lambda 主体提取到方法中,并使用对该方法的调用作为无主体 lambda 表达式的值)。 (19认同)
  • 通过输入它们。模仿我对前两个属性所做的操作。 (4认同)