C# 将查询语法转换为Lambda表达式
我需要将以下查询语法转换为lambda表达式。 我正在尝试这样做,但不知道如何在lambda表达式中使用let子句C# 将查询语法转换为Lambda表达式,c#,linq,C#,Linq,我需要将以下查询语法转换为lambda表达式。 我正在尝试这样做,但不知道如何在lambda表达式中使用let子句 List<ClInd> clIndls = (from clIndls in Connection.ClIndls join indls in Connection.Indls on clIndls.IndID equals indls.ID
List<ClInd> clIndls =
(from clIndls in Connection.ClIndls
join indls in Connection.Indls
on clIndls.IndID equals indls.ID
where pins.Contains(indls.PIN.Value)
let clIndal = clIndls.ClIndalAddes.OrderByDescending(y => y.UpdatedDate).FirstOrDefault(x => x.ClIndID == clIndls.ID)
select new ClInd
{
ID = clIndls.ID,
MailingAddress = new LiableIndlAddress(){
City = clIndal.Address.City,
}
}).Distinct().ToList();
List clIndls=
(来自Connection.clIndls中的clIndls
在Connection.indls中加入indls
在clIndls.IndID上等于indls.ID
其中pins.Contains(indls.PIN.Value)
设clIndal=clIndls.ClIndalAddes.OrderByDescending(y=>y.updateDate).FirstOrDefault(x=>x.ClIndID==clIndls.ID)
选择新的ClInd
{
ID=clIndls.ID,
MailingAddress=new LiableIndlAddress(){
City=clIndal.Address.City,
}
}).Distinct().ToList();
我的做法:
List<ClaimLiableIndividual> claimLiableIndividuals = Connection.ClIndls.Join(Connection.Indls,
clIndls => clIndls.IndID,
indls => indls.ID,
(clmIndividuals, individuals) => new { ClmIndividuals = clmIndividuals, Individuals = individuals }).Where(x => pins.Contains(indls.PIN.Value))
List claimlibleIndividuals=Connection.ClIndls.Join(Connection.Indls,
clIndls=>clIndls.IndID,
indls=>indls.ID,
(clmIndividuals,personals)=>new{clmIndividuals=clmIndividuals,personals=personals})。其中(x=>pins.Contains(indls.PIN.Value))
如果您在这方面有任何帮助,我们将不胜感激。老实说,如果涉及到
Join
,我会避免使用方法语法,如果您已经有了工作代码,我不喜欢方法语法中的Join。然而
方法语法中没有let
,您需要将结果放入匿名类型(或其他类型)的属性中。但在这里,您不需要它:
List<ClaimLiableIndividual> claimLiableIndividuals =
Connection.ClIndls.Join(
Connection.Indls,
clIndls => clIndls.IndID,
indls => indls.ID,
(clmIndividuals, individuals) => new
{
ClmIndividuals = clmIndividuals,
Individuals = individuals
}
)
.Where(x => pins.Contains(x.Individuals.PIN.Value))
.Select(x => new ClInd
{
ID = x.ClmIndividuals.ID,
MailingAddress = new LiableIndlAddress
{
City = x.ClmIndividuals.ClIndalAddes
.OrderByDescending(a => a.UpdatedDate)
.FirstOrDefault(a => a.ClIndID == x.ClmIndividuals.ID)?.Address.City
}
})
.Distinct()
.ToList();
列出可索赔的个人=
Connection.ClIndls.Join(
连接。Indls,
clIndls=>clIndls.IndID,
indls=>indls.ID,
(公民、个人)=>新
{
ClmIndividuals=ClmIndividuals,
个人=个人
}
)
.Where(x=>pins.Contains(x.personals.PIN.Value))
.选择(x=>newclind
{
ID=x.ClmIndividuals.ID,
MailingAddress=新的责任地址
{
城市=x.ClmIndividuals.clindalades
.OrderByDescending(a=>a.UpdateDate)
.FirstOrDefault(a=>a.ClIndID==x.ClmIndividuals.ID)?.Address.City
}
})
.Distinct()
.ToList();
请注意,如果您在
ClInd
中重写Equals
和GetHashCode
,将转换为,则Distinct
仅起作用。选择调用,但您确实不应该执行此转换,因为您现在拥有的代码的可读性远远高于转换时的结果翻译。我需要为这个方法编写单元测试,我使用Moq.Expression,我面临着为查询语法编写单元测试的困难,所以我将它转换为lamda表达式,这样我就可以编写毫无意义的单元测试了。这两个语法具有相同的语义,产生了完全相同类型的表达式,具有完全相同的含义。仅供参考,它被称为方法语法谢谢Tim,是的,这是我要找的,它是一个旧代码,所以正在尝试重构it@sajeshNambiar,它不是重构,而是破坏可读性。安装整形器它可以为您在一次点击。