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

时间:2013-02-13 11:08:21

标签: c# linq linq-to-entities iqueryable

当我尝试在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”。

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

如果有任何疑问,请先询问,谢谢。

3 个答案:

答案 0 :(得分:3)

以下内容应该有效:

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

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

答案 1 :(得分:2)

此表达式

(p, q) => SelectSearchColumns

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

答案 2 :(得分:2)

在表达式(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)