【问题标题】:Nested Expression method call in Linq.Select()Linq.Select() 中的嵌套表达式方法调用
【发布时间】:2018-10-08 01:55:47
【问题描述】:

我在每次 db 手动命中后使用.Select(i=> new T{...}) 将我的实体对象转换为 DTO 对象。以下是一些示例实体和 DTOS

用户实体;

public partial class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public virtual UserEx UserEx { get; set; }
}

用户 DTO;

public class UserDTO
{
    public int Id { get; set; }
    public string Username { get; set; }
}

UserEx 实体;

public class UserEx
{
    public int UserId { get; set; }
    public string MyProperty1 { get; set; }
    public virtual User User { get; set; }
}

UserEx DTO;

public class UserExDTO
{
    public int MyProperty1 { get; set; }
    public UserDTO UserModel { get; set; }
}

我的转化表达方法;

public static class ConversionExpression
{
    public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
    {
        return userEx => new UserExDTO
        {
            MyProperty1 = userEx.MyProperty1,
            UserModel = new UserDTO
            {
                Id = userEx.User.Id,
                Username = userEx.User.Username
            }
        };
    }

    public static Expression<Func<User, UserDTO>> GetUserDTOConversionExpression()
    {
        return user => new UserDTO
        {
            Id = user.Id,
            Username = user.Username
        };
    }
}

还有我目前对 UserDTO 的使用;

myContext.Users
    .Select(ConversionExpression.GetUserDTOConversionExpression())
    .ToList();

对于 UserExDTO;

myContext.UserExes
    .Select(ConversionExpression.GetUserExDTOConversionExpression())
    .ToList();

抱歉介绍太长了,现在这是我的问题; 我要分组

new UserDTO
{
    Id = userEx.User.Id,
    Username = userEx.User.Username
}

由于单点问题。所以我想要这样的东西;

public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
{
    return userEx => new UserExDTO
    {
        MyProperty1 = userEx.MyProperty1,
        //this line does not behave like the other one 
        UserModel = userEx.User.GetUserDTOConversionExpression()
    };
}

有什么方法可以做到这一点,或者我应该写下每个与类似需求无关的个人表达方式吗?

【问题讨论】:

  • 不是开箱即用的。看看一些 3rd 方库,如 LINQKitNeinLinq.EntityFrameworkCore 等。
  • @IvanStoev NeinLinq 似乎有效。选择器翻译实际上是我问题的关键。谢谢你的建议。

标签: c# linq lambda expression entity-framework-core


【解决方案1】:

我只用 NeinLinq 解决了我的问题。这是我的解决方案; 您需要先删除嵌套声明。

public static Expression<Func<UserEx, UserExDTO>> GetUserExDTOConversionExpression()
{
    return userEx => new UserExDTO
    {
        MyProperty1 = userEx.MyProperty1
        //We removed other model declaration here.
    };
}

然后使用 NeinLinq 的 To 方法定义翻译;

public static Expression<Func<UserEx, UserExDTO>> GetUserExDtOCompbinedExpression()
    {
    //Translate() and To() methods do all the job
    return GetUserDTOConversionExpression().Translate()
       .To(userEx => userEx.User, userExDTO => userExDTO.UserModel, GetUserExDTOConversionExpression());
    }

【讨论】:

    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 2015-09-27
    • 1970-01-01
    相关资源
    最近更新 更多