2017-08-17 122 views
0

我有一个产品,这个产品可以有一些语言描述。实体框架Linq Include()嵌套条件

我希望根据product.Reference和​​获取与产品语言代码匹配的产品和说明。我使用EF核心2.0

我可以用2个分开的查询做到这一点,但如果可能的话我想要一个。

我尝试这样做:

var product = _context.Products 
    .Where(x => x.Reference == "3265709") 
    .Include(x => x.ProductDescriptions) 
    .ThenInclude(x => x.Where(lg => lg.Language.Code == "EN").Select(z => z.Language)) 
    .ToList(); 

任何想法?

感谢,

public class Product 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Reference { get; set; } 
    public ICollection<ProductDescription> ProductDescriptions{ get; set; } 
} 

public class ProductDescription 
{ 
    public int Id { get; set; } 
    public string Short { get; set; } 
    public string Complete { get; set; } 
    public Language Language{ get; set; } 
    public Product Product { get; set; } 
} 

public class Language 
{ 
    public int Id { get; set; } 
    public string Code { get; set; } 
    public string Name { get; set; } 
} 
+2

你可以发布你使用的两个查询吗? –

+0

我看到如何在两个查询中做到这一点,但还没有做。我想首先在一个查询中。 –

+1

你的问题并不清楚(至少对我而言)。如果您展示双查询解决方案,它可以帮助其他人理解您需要的是什么。 –

回答

1

你能不能做这样的事?您甚至可能不需要.Any()部件。

var product = _context.Products.Where(x => x.Reference == "3265709" && x.ProductDescriptions.Any(a => a.Language.Code == "EN")) 
    .SelectMany(x => x.ProductDescriptions.Where(z => z.Language.Code == "EN").Select(a => a.Language)).ToList(); 

编辑:

这是你在找什么呢?这应该为您提供指定参考代码的产品列表以及基于语言代码的过滤产品描述列表。

var product = _context.Products.Where(x => x.Reference == "3265709" && x.ProductDescriptions.Any(a => a.Language.Code == "EN")).Select(x => new Product { 
     Id = x.Id, 
     Name = x.Name, 
     ProductDescriptions = x.ProductDescriptions.Where(a => a.Language.Code == "EN").ToList(), 
     Reference = x.Reference 
}); 
+0

结果是一种语言,而不是ProductDescription的产品,但有一些想法需要采取 –

+0

哦,我认为基于你的linq .Select(z => z.Language)的这一部分,你想返回一个语言列表。 –

+0

阅读代码之前的行:) –