【问题标题】:Applying a Condition to an Eager Load (Include) Request in Linq to Entities在 Linq to Entities 中将条件应用于急切加载(包含)请求
【发布时间】:2010-07-26 01:27:25
【问题描述】:

我有一个表产品。 Product 以一对多的关系与 ProductDescription 相关。每个产品的 ProductDescription 可以有不止一行。如果产品描述有多个翻译,它将有多个行。产品与语言是多对一的关系。 Language 有一个语言代码(en、es 等)和一个 LanguageId(也可以在 ProductDescription 中找到)。

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

我很想在 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 to Objects 过滤掉它们,这肯定不太理想。我可以在循环中获取每个产品的语言代码,但这需要多次 SQL 往返,我也不想要。

感谢任何帮助!

【问题讨论】:

  • 哦,我忘了提,以防有人想提“Any()”。这在这种情况下不起作用,因为它对 ProductDescription 应用了一个过滤器,这会影响我的根结果集。由于语言代码,我不希望结果减少我只想防止填充不需要的语言。

标签: c# .net linq-to-entities eager-loading


【解决方案1】:

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

【讨论】:

  • 这是我过去在 LinqToSql 中使用的东西,但在这种特定情况下,我使用的是 Linq to Entities 和 PredicateBuilder。我想虽然这不是谓词的一部分,而是选择语句。我可能仍然无法实现这一点。如果我这样做,我会发布一个更完整的示例。
  • 这在 L2S 和 L2E 中的工作方式完全相同。 PredicateBuilder 在 L2E 中需要 AsExpandable,但在其他方面照常工作。
  • 我很难找到合适的位置。也许是因为我没有在查询上执行 .Select ,这是我认为投影可能需要的。这是我的查询。 “wherePredicate”是 PredicateBuilder。 var query = inventoryRepository.Products .Include("ProductDescriptions") .Include("ProductAllowedWarehouses") .Include("ProductToCategories") .Include("PriceLevels") .Include("AttachmentAssociations.Attachment").AsExpandable() .Where( wherePredicate);
  • 正如我所建议的那样,这是一种急切加载(不起作用)的尝试,而不是投影。使用投影,就像我说的那样。
  • 对不起,你误会了。我正在为某些表使用急切加载。如果我要进行投影,我知道我会为 ProductDescription 提供急切的加载提示,我只是在粘贴代码之前没有这样做。我想我可以摸索我的方式并找到答案。我不想添加 Select 子句,因为那样我必须手动将每个字段映射到结果集(例如 Select (a=> new Product { ProductDescription = ...}。虽然允许我使用投影,但它还需要我一次映射数据库中的每个字段。我想这是我唯一的选择。
猜你喜欢
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多