当我尝试在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”。
想知道为什么会出现这种错误,如何解决这个问题。
如果有任何疑问,请先询问,谢谢。
答案 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)