【发布时间】: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 方库,如 LINQKit 或 NeinLinq.EntityFrameworkCore 等。
-
@IvanStoev NeinLinq 似乎有效。选择器翻译实际上是我问题的关键。谢谢你的建议。
标签: c# linq lambda expression entity-framework-core