C# 如何在实体框架中定义表达式选择嵌套的一对一关系
我正在尝试在实体框架中运行一个包含此C# 如何在实体框架中定义表达式选择嵌套的一对一关系,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我正在尝试在实体框架中运行一个包含此表达式的Linq to实体 不工作: //2 seperated expressions, 1st expression calling the 2nd expression public Expression<Func<User, UserDto>> UserToDtoExpr() { var expr = AddressToDtoExpr(); return x => new UserDto() {
表达式的Linq to实体
不工作:
//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
};
}
但我不想像第二种方式那样硬编码,因为我想模块化并重用这些Expression
函数。我如何确定第一种方法使其工作?谢谢。您需要使用的AsExpandable()
来实现这一点
首先,将表达式更改为使用LinqKit的Invoke()
(扩展方法),如下所示:
Address = expr.Invoke(x.Address) // instead of expr.Compile()(x.Address)
然后在DbSet
上使用AsExpandable()
:
阅读以了解嵌套表达式的问题。如果不使用LinqKit,很难实现此结构吗?expr.Compile()
返回EF无法转换为SQL的Func
。必须采取一些措施来克服这个问题,LinqKit
优雅而有效地解决了这个问题。如果您不喜欢引入新代码而不打算自己编写变通方法,我假设您必须使用正则lambda构造表达式。
Address = expr.Invoke(x.Address) // instead of expr.Compile()(x.Address)
var results = context.Users.AsExpandable().Select(UserToDtoExpr());