在Linq中重构嵌套查询到实体框架

时间:2010-11-04 05:33:36

标签: c# entity-framework linq-to-entities

假设我有这个问题:

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 个答案:

答案 0 :(得分:1)

根据评论进行编辑

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