2

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

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

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

4

3 回答 3

3

以下应该有效:

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

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

于 2013-02-13T11:16:33.743 回答
2

这个表达

(p, q) => SelectSearchColumns

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

于 2013-02-13T11:16:13.653 回答
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)
于 2013-02-13T11:17:59.317 回答