2017-08-17 128 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

閱讀代碼之前的行:) –