2010-11-04 73 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