C# 组合两个LINQ表达式投影
我有实体类:C# 组合两个LINQ表达式投影,c#,linq,entity-framework,lambda,delegates,C#,Linq,Entity Framework,Lambda,Delegates,我有实体类: public class Company { public int Id {get;set;} public string Name {get;set;} public int PrivateNumber {get;set;} public DateTime Created {get;set;} public DateTime? LastModified {get;set;} } 我要上课了: public class CompanyDTO { public int Id
public class Company
{
public int Id {get;set;}
public string Name {get;set;}
public int PrivateNumber {get;set;}
public DateTime Created {get;set;}
public DateTime? LastModified {get;set;}
}
我要上课了:
public class CompanyDTO
{
public int Id {get;set;}
public string Name {get;set;}
public int PrivateNumber {get;set;}
}
对于普通用户,我使用的是投影:
Expression<Func<Company, CompanyDTO>> proj1 = x => new CompanyDTO {
Id = x.Id,
Name = x.Name
};
对于第二个场景,我想用proj2中定义的内容扩展我的proj1,以便我可以将上面的查询改进为:
CompanyDTO dto = ctx.Companies.Where(x => x.Id == id).Select(proj).FirstOrDefault();
其中项目为:
- 场景1:proj=proj1
- 场景2:proj=proj1扩展到proj2
这可行吗?如果可行,如何实现?你能做到吗?对这非常简单,因为您只需将
BindExpressions
组合到NewExpressions
上即可。另一个问题是,你应该这样做吗?我的答案是,谷歌他们什么都不做!我可以问一下你想实现什么,这样我才有可能让你的同事摆脱这种怪癖吗?也许你可以尝试使用AutoMapper
,然后创建一个公司,其电话号码为:CompanyDto
。那会好得多。然后让AutoMapper
处理所有ExpressionTree
的内容。在场景2中,我想将5个属性中的3个投影到我的DTO。显然,两种场景中的两个属性是相同的。为什么我要写两个select语句,其中2/3的投影细节相同?抱歉,我不是在寻找外部解决方案,我是在问是否可以用正则C#表达式来实现。Automapper将允许您通过编写零选择表达式来实现这一点。您可以通过告诉Automapper您想要忽略其中一个属性的表达式来实现这一点。其次,简单地不映射你的PrivateNumber
prop,你就会丢失信息。如果我们要将您的数据重新保存到数据库中,您就无法判断您的用户是否正在尝试删除他们的电话号码,或者根本就没有电话号码。当然,如果(user.IsAdmin()),你可以做一个,但最终你会得到更多的代码,而不是更少。感谢你对Automapper的理论支持和建议,但我的问题相当清楚。我要的是问题的解决办法,不是建议。如果您能提供将两个表达式合并为一个表达式的代码,我将不胜感激。
CompanyDTO dto = ctx.Companies.Where(x => x.Id == id).Select(proj1).FirstOrDefault();
CompanyDTO dto = ctx.Companies.Where(x => x.Id == id).Select(proj).FirstOrDefault();