如何在Entity Framework中定义表达式选择嵌套的一对一关系
我正在尝试将包含此Expression
的Linq-to-Entity运行到Entity Framework中。
不工作:
//2 seperated expressions, 1st expression calling the 2nd expression public Expression<Func> UserToDtoExpr() { var expr = AddressToDtoExpr(); return x => new UserDto() { Id = x.Id, Name = x.Name, Address = expr.Compile()(x.Address) }; } public Expression<Func> AddressToDtoExpr() { return x => New AddressDto() { Id = x.Id, City = x.City, Country= x.Country }; }
例外 : The LINQ expression node type 'Invoke' is not supported in LINQ to Entities.
现在,我是硬编码并将其嵌套到一个Expression
并将其放入Linq-to-Entity然后它可以工作:
//hardcode combined together into 1 expression with nested object public static Expression<Func> 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)
然后在DbSet
上使用AsExpandable()
:
var results = context.Users.AsExpandable().Select(UserToDtoExpr());
阅读本文以了解嵌套表达式的问题。