我正在尝试在 Entity Framework 中运行包含此表达式
的Linq-to-Entity。
不工作:
//2 seperated expressions, 1st expression calling the 2nd expression
public Expression<Func<User, UserDto>> UserToDtoExpr() {
var expr = AddressToDtoExpr();
return x => new UserDto() {
Id = x.Id,
Name = x.Name,
Address = expr.Compile()(x.Address)
};
}
public Expression<Func<Address, AddressDto>> AddressToDtoExpr() {
return x => New AddressDto() {
Id = x.Id,
City = x.City,
Country= x.Country
};
}
异常:LINQ to Entities 不支持 LINQ 表达式节点类型“Invoke”。
现在,如果我硬编码并将其嵌套到一个 Expression
中,然后将其放入 Linq-to-Entity 中,那么它就可以工作了:
//hardcode combined together into 1 expression with nested object
public static Expression<Func<User, UserDto>> UserToDtoExpr() {
return x => new UserDto() {
Id = x.Id,
Name = x.Name,
Address = New AddressDto() {
Id = x.Address.Id,
City= x.Address.City,
Country = x.Address.Country
}
};
}
但我不想像第二种方式那样对其进行硬编码,因为我想模块化并重用这些 Expression
函数。我如何修复第一种方法使其工作?谢谢。
最佳答案
您需要使用LinqKit的AsExpandable()
来实现这一目标。
首先,更改表达式以使用 LinqKit 的 Invoke()
(扩展方法)如下:
Address = expr.Invoke(x.Address) // instead of expr.Compile()(x.Address)
然后使用 AsExpandable()
在您的DbSet<T>
上:
var results = context.Users.AsExpandable().Select(UserToDtoExpr());
阅读this了解嵌套表达式的问题。
关于c# - 如何在 Entity Framework 中定义表达式选择嵌套一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960715/