在linq中存储变量

时间:2014-06-30 14:19:16

标签: c# linq entity-framework

我今天遇到了这种情况,在网上找不到我想要的东西。

看看这段代码,

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: "": "")
});

5 个答案:

答案 0 :(得分:2)

我认为你可能不得不改为使用LINQ来实现它,但你可以使用LINQ's let clause在表达式的中间分配变量。

答案 1 :(得分:2)

试试这个:

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

答案 2 :(得分:0)

  

myCollection.Select(g => {   var temp = sectors.FirstOrDefault(); ...

     

返回新的ReportLine(){..};

     

})

答案 3 :(得分:0)

这应该是你要找的东西:

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() ?? " "
});

答案 4 :(得分:-1)

您可以将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))