问题
I have 2 models, say Product and Category:
public class Category
{
public Category() { }
// primary key
public long Id { get; set; }
// other properties are omitted
public virtual IList<Product> Products { get; set; }
}
public class Product
{
public Product() { }
// primary key
public long Id { get; set; }
// title/name
public string Title { get; set; }
public virtual IList<Category> Categories { get; set; }
}
As you can see there is a many-to-many relationship between these models; each product can have multiple categories and for each category we can have multiple products.
The question is how can I select distinct categories associated with a list of products. I want something like this:
// making a list of products
var p = db.Products.Where(i => i.Title.Contains("Apple"));
// getting distinct categories of those products
var c = p.Select(i => i.Categories)... // stuck here
I just want to select categories of the products that their title contains a keyword. Am I doing it right at all?
回答1:
something like:
var p = db.Products.
Where(i => i.Title.Contains("Apple")).
SelectMany(i => i.Categories).
Distinct();
should do.
回答2:
I would rather start from Categories and apply Any based condition on their associated Products. This way the query will not need to apply Distinct on the result which might be costly:
var categories = db.Categories
.Where(c => c.Products.Any(p => p.Title.Contains("Apple")));
来源:https://stackoverflow.com/questions/44782360/how-to-select-listb-from-lista-where-a-and-b-are-many-to-many-related-using