Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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# 组合两个LINQ表达式投影_C#_Linq_Entity Framework_Lambda_Delegates - Fatal编程技术网

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