2010-07-26 45 views
0

我有一个表Product。产品与ProductDescription以一对多的关系相关。每个产品的ProductDescription可以有多行。如果产品描述有多个翻译,它将有多行。产品与语言有多对一的关系。语言具有语言代码(en,es等)以及LanguageId(也可以在ProductDescription中找到)。将条件应用于Linq中的预先加载(包含)请求到实体

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

我在Linq to Entities中完成了这个任务。我想产生这样的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过滤掉它们,这肯定不太理想。我可以在一个循环中获得每个产品的语言代码,但这需要多次SQL往返,这也是我不想要的。

感谢任何帮助!

+0

哦,如果有人想提起“Any()”,我忘了提及。这在这种情况下不起作用,因为它将过滤器应用于影响我的根结果集的ProductDescription。我不希望更少的结果,因为我只是想防止不需要的语言被填充。 – omatase 2010-07-26 01:30:00

回答

0

使用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. 
      } 
     }; 
+0

这是我以前用LinqToSql的东西,但在这个特定的情况下,我使用Linq to Entities和PredicateBuilder。我想尽管这不是谓词的一部分,而是选择语句。我可能仍然遇到麻烦。如果我这样做,我会发布一个更完整的例子。 – omatase 2010-07-26 15:04:52

+0

这在L2S和L2E中的工作原理完全相同。 PredicateBuilder在L2E中需要'AsExpandable',但其他方式一切正常。 – 2010-07-26 15:06:22

+0

我很难找出它适合的地方。也许这是因为我没有做。选择我认为可能需要投影的查询。这是我的查询。 “WherePredicate”是PredicateBuilder。 VAR查询= inventoryRepository.Products .INCLUDE( “ProductDescriptions”) .INCLUDE( “ProductAllowedWarehouses”) .INCLUDE( “ProductToCategories”) .INCLUDE( “PriceLevels”) .INCLUDE( “AttachmentAssociations.Attachment”) .Expandable() 。Where(wherePredicate); – omatase 2010-07-27 14:38:41