代码之家  ›  专栏  ›  技术社区  ›  omatase

将条件应用于linq to实体中的预先加载(include)请求

  •  0
  • omatase  · 技术社区  · 14 年前

    我有一种餐桌用品。产品在一对多关系中与产品描述相关。每个产品的ProductDescription可以有多行。如果产品描述有多个翻译,它将有多行。产品与语言有多对一的关系。语言有一个语言代码(en、es等)和一个languageID(也可以在productDescription中找到)。

    我想让我的用户能够请求一个产品,并进一步告诉应用程序只返回特定语言的描述。

    我很难在Linq to实体中实现这一点。我想生成这样的SQL:

    SELECT * FROM Product p
    JOIN ProductDescription pd ON p.ProductId = pd.ProductId
    JOIN (SELECT * FROM Language WHERE AlternateCode = 'es') AS l ON pd.LanguageId = l.LanguageId
    

    (alternatecode是语言代码的字段名)

    有人知道怎么做吗?我现在剩下的就是把所有的语言都拉下来,然后用linq-to对象过滤掉它们,这些对象肯定不太理想。我可以在一个循环中获得每个产品的语言代码,但这需要多次SQL往返,我也不希望这样。

    谢谢你的帮助!

    1 回复  |  直到 14 年前
        1
  •  0
  •   Craig Stuntz    14 年前

    使用A projection 不急于装货。

    var q = from p in Context.Product
            select new ProductPresentation
            {
               Id = p.Id,
               // etc.
               Description = new ProductDescriptionPresentation
               {
                   Language = (from l in p.ProductDescription.Languages
                               where l.AlternateCode.Equals("es", StringComparison.OrdinalIgnoreCase)
                               select l).FirstOrDefault(),
                   // etc.
               }
            };