Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在实体框架中定义表达式选择嵌套的一对一关系_C#_Entity Framework_Linq To Entities - Fatal编程技术网

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());