为什么';Lambda';在我的LINQ to Entities语法中不支持

本文关键字:Entities 语法 不支持 to 我的 Lambda 为什么 LINQ | 更新日期: 2023-09-27 17:58:59

当我尝试在LINQ to Entities中运行以下查询时出错:

public IEnumerable TestOne2()
{
    var query = this.Context.CmnAddressCities
        .Join(this.Context.CmnAddressStates, 
              p => p.StateID, q => q.StateID, 
              (p, q) => SelectSearchColumns)
        .ToList();
     return query;
}
public Expression<Func<CmnAddressCity,CmnAddressState, dynamic>>
    SelectSearchColumns = (e,r) => new
        {
            CityID = e.CityID,
            CityName = e.CityName,
            StateName=r.StateName,
        };

错误消息:

LINQ to Entities中不支持LINQ表达式节点类型"Lambda"。

我想知道为什么会出现这个错误,以及如何解决这个问题。

为什么';Lambda';在我的LINQ to Entities语法中不支持

以下内容应该有效:

var query = this.Context.CmnAddressCities
                .Join(this.Context.CmnAddressStates, 
                      p => p.StateID, 
                      q => q.StateID, 
                      SelectSearchColumns)
                .ToList();

差异见倒数第二行。您的版本创建了一个返回表达式的表达式。EF提供程序无法将其转换为SQL,SQL中表达式的等效性是什么?这是不存在的
您只需将表达式作为参数本身传递即可。

此表达式

(p, q) => SelectSearchColumns

是一个返回表达式的表达式。尝试将其单独更改为SelectSearchColumns

在表达式(p, q) => SelectSearchColumns中,您将SelectSearchColumns传递给Join方法,而不是调用它。查询提供程序随后无法将其转换为SQL语句,因为它是作为数据传递的,而不是被解释为调用。

您需要任一

.Join(this.Context.CmnAddressStates, 
     p => p.StateID, 
     q => q.StateID, 
     (p, q) => SelectSearchColumns(p, q))

或短版

.Join(this.Context.CmnAddressStates, 
     p => p.StateID, 
     q => q.StateID, 
     SelectSearchColumns)