2014-06-30 65 views
0

我今天面對這種情況,無法在網上找到我想要的。店內變量linq

看看這段代碼,

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

回答

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

很確定EF無法正確翻譯。 – Servy

+0

@Servy,爲什麼不呢?那是標準的linq?你的意思是因爲它不能查找'合約',然後'站'和'部門'?如果你問我那不是上述問題的linq,而是EF,如果使用的話,並且他在表達式中有一個真正的嵌套結構。 –

2

我想你也許會不得不更改爲長手LINQ做到這一點,但您可以使用LINQ's let clause在一個表達式的中間變量賦值。

+0

什麼是長手LINQ?我看到使用流利的語法沒有問題。 –

+0

有關示例,請參閱答案中的鏈接。這是一種更詳細的,SQL-ish方式來編寫相同的表達式。 –

+0

我知道常規的linq語法和let子句,我只是認爲在寫長篇LINQ時你的意思是別的,因爲我從來沒有聽說過。但你爲什麼認爲他必須改變語法? –

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

如果您進行此更改,則EF將無法解析代碼以將其轉換爲SQL。 – Servy

+0

是否指定這是一個SQL調用? – PulseLab

+0

這個問題被標記爲EF。 – Servy

0

myCollection.Select(G => { 變種臨時= sectors.FirstOrDefault(); ...

return new ReportLine(){..};

} )

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