2010-11-04 67 views
0

假如我有這個疑問:Refractoring Linq中的嵌套查詢到實體框架

var ps = from p in dc.Products 
     let text = 
      (from t in p.Text 
       orderby t.Language == "ja" descending 
       select t).FirstOrDefault() 
     select new { p.Id, text.Name }; 

有什麼辦法來折射被分配到text查詢?

我的猜測是我需要使它成爲Expression<Func<Product, string, ProductText>>,但我不知道如何調用它。順便說一下,如果有更有效的方法來做到這一點,我很樂意知道。

感謝,

編輯:爲了澄清,該想法是,如果日本無法使用,我希望它依傍任何其他語言可用。

也許這樣更有效率?

let text = p.Text.FirstOrDefault(t => t.Language == "ja") ?? p.Text.FirstOrDefault() 

無論哪種方式,我的主要問題是關於我會如何做text查詢可重複使用的 - 因爲它是相當直觀,我能想象自己或別人這樣做是錯誤的未來。

回答

1

EDITED BASED簡評

var ps = dc.Products.Select(p => new 
{ 
    Id = p.Id, 
    Text = p.Text.OrderBy(t=> t.Language == "ja").First() 
}) 
.Select (x => new 
{ 
    Id = x.Id, 
    Name = x.Name, 
    ... 
}); 
+0

不完全是,因爲我希望它依傍任何一種語言,是可用的。另外,我可能會想要的不僅僅是'名字' - 因此'let'。 – 2010-11-04 05:58:57

+0

有道理,雖然我懷疑你真的想回到特定的語言,而不是一些隨機的?那編輯後的版本呢?儘管現在它與你開始的東西幾乎完全相同。 – 2010-11-04 06:08:50

+0

嗯是的,這看起來非常接近我的第一個。我猜測執行的查詢幾乎是一樣的。回到某種特定的語言會很好(可能是英語),但如果我以第三種語言結束,我可能會擔心它。應該能夠添加一個'然後通過fallbackPriority'或者沿着這些線。現在我只擔心日語和英語。 – 2010-11-04 06:17:29