将变量存储在linq中
本文关键字:linq 存储 变量 | 更新日期: 2023-09-27 18:10:53
我今天遇到了这种情况,在网上找不到我想要的。
看这段代码,
myCollection.Select(g => new ReportLine
{
cds = (sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)) != null ?
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).USER != null?
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).USER.USER_FIRSTNAME : "": "")
+ " " +
(sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)) != null ?
sectors.Where(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).FirstOrDefault().USER != null?
sectors.Where(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE)).FirstOrDefault().USER.LASTNAME : "" : "")
});
基本上"myCollection"是一个深度类的列表,这个请求进入它提取名字和姓氏,并将它们放在另一个类中,同时检查是否有空值。
你注意到为了达到目的,我检查了同样的事情6次:
sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE))
(可能影响性能)
是否存在在linq表达式中"存储"值的方法?像这样:
myCollection.Select(g => new ReportLine
{
cds = ((var tmp =sectors.FirstOrDefault(s => s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE))) != null ?
tmp.USER != null?
tmp.USER.USER_FIRSTNAME + "" + tmp.USER.LASTNAME: "": "")
});
试试这个:
myCollection.Select(g => {
var sect_code = g.Contract.Station.Sector.SECT_CODE;
var sector = sectors.FirstOrDefault(s => s.SECT_CODE.Equals(sect_code));
var firstName = sector != null ?
(sector.USER != null ? sector.USER.USER_FIRSTNAME: "") :
"";
var lastName = sector != null ?
(sector.USER != null ? sector.USER.LASTNAME : "") :
"";
return new ReportLine
{
cds = string.Format("{0} {1}", firstName, lastName)
};
});
我认为你可能必须更改为长手LINQ来实现它,但是你可以使用LINQ的let子句在表达式中间分配变量
myCollection。选择(g => {)var temp = sectors.FirstOrDefault ();…
return new ReportLine(){…};
})
这应该是你要找的:
myCollection.Select(g => new ReportLine
{
cds = (from s in sectors
where s.SECT_CODE.Equals(g.Contract.Station.Sector.SECT_CODE) && s.USER != null
select string.Format("{0} {1}", s.USER.USER_FIRSTNAME, s.USER.USER_LASTNAME)).FirstOrDefault() ?? " "
});
您可以将Select
语句中的逻辑提取到单独的方法中,并在Select
语句中调用该方法?
之类的…
private string Foo(Sector input)
{
var tmp = g.SECT_CODE.Equals etc etc
return tmp.USER != null ? etc etc
}
…
myCollection.Select(g => Foo(g))