将变量存储在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: "": "")
});

将变量存储在linq中

试试这个:

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