0

这是我几天前发布的另一个问题的衍生,该问题已成功回答,但它确实没有涉及我遇到的潜在问题,但无法在我的原始查询中完全表达。

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

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

我遇到的问题是我知道我需要使用投影来完成这个问题的第 3 段中的任务。像这样的东西:

    var query = inventoryRepository.Products
                        .Where(wherePredicate)
                        .Select( a=> new Product
                        {
                            ProductDescriptions = inventoryRepository.ObjectContext.ProductDescriptions
                               .Where(a => a.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase))
                        });

但是,除了语言部分之外,我在 Products 表中还有 4 个 Products 的其他子表需要为结果集加载大约 15 个属性。有什么方法可以让我进行急切加载和投影,这样我就不必手动映射所有这些属性和子对象?这是我的代码现在所在的位置:

var query = inventoryRepository.ObjectSet
                    .Include("ProductDescriptions")
                    .Include("ProductAllowedWarehouses")
                    .Include("ProductToCategories")
                    .Include("PriceLevels")
                    .Include("AttachmentAssociations.Attachment").AsExpandable()
                    .Where(wherePredicate);

不需要选择,这真的很好。一旦我将 ProductDescriptions 更改为投影,我就会添加一个 Select,然后我不会免费填充任何其他属性/子项。

4

1 回答 1

1

我会阅读这个关于预测+热切加载的博客。当涉及到急切加载时,您会遇到问题。建议使用 .Any 并执行子选择。

为什么不能在 ProductDescriptions 上添加过滤器/位置?

 var query = inventoryRepository.ObjectSet
                .Include("ProductDescriptions")
                .Include("ProductAllowedWarehouses")
                .Include("ProductToCategories")
                .Include("PriceLevels")
                .Include("AttachmentAssociations.Attachment").AsExpandable()
                .Where(wherePredicate)
                .Where(a=>a.ProductDescriptions.Languages.AlternateCode.Equals("en", StringComparison.CurrentCultureIgnoreCase);
于 2010-07-27T19:50:55.497 回答