c# - 如何在 Entity Framework 中定义表达式选择嵌套一对一关系

标签 c# entity-framework linq-to-entities

我正在尝试在 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 函数。我如何修复第一种方法使其工作?谢谢。

最佳答案

您需要使用LinqKitAsExpandable()来实现这一目标。

首先,更改表达式以使用 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/

相关文章:

c# - 尝试从存储过程中读取多个实体结果集时出现问题

silverlight - 使用 Silverlight 在 RIA 服务中用一 block 石头杀死两只鸟

c# - 将两种扩展方法合二为一

C# - 如何验证字符串是否为 hh :mm:ss:fff? 格式

c# - 我的积分算法是否正确?我们还可以在并行处理和效率方面提高这一点吗?代码在 C# 中

mysql - 部署 - 带有 Entity Framework 的 MySQL

c# - EntityState.Deleted 不起作用,Remove(entity) 起作用吗?

c# - 如果可能,从 O(1) 中的 32 位值中选择随机位

c# - 方法如何知道它是否在 UI 线程上运行?

c# - 编写基本的表达式生成器