LINQ многие ко многим ад - запросы, где СОДЕРЖИТ ВСЕ - PullRequest
4 голосов
/ 22 июля 2010

У меня есть отношения многие ко многим следующим образом:

Продукты Код товара Описание

ProductFeatures ProductFeatureID Код товара FeatureId

Особенности FeatureId Описание

Любой продукт может иметь много функций.

Затем я прихожу вместе с iQueryable под названием «SearchFeatures», который содержит два конкретных объекта Feature, по которым я хочу выполнить поиск.

Я хочу найти продукты, которые имеют ВСЕ эти функции!

например. что-то вроде этого было бы неплохо:

return db.Products.Where(x => x.Features.ContainsAll(SearchFeatures));

Какой самый чистый способ добиться этого с помощью LINQ?

Большое спасибо.

Ответы [ 5 ]

5 голосов
/ 22 июля 2010
IQueryable<Products> products = db.Products;
foreach (var feature in SearchFeatures)
{
    Feature tmpFeature = feature;
    products = products
        .Where(x=>x.ProductFeatures.Any(y=>y.FeatureID == tmpFeature.FeatureID));
}
2 голосов
/ 22 июля 2010
from item in db.Products
where item.ProductFeatures.Where(x=>featIdList.Contains(x.FeatureId)).Count() == featIdList.Count
select item

Это должно сделать это. featIdList - это список идентификаторов функций, которые вы ищете

1 голос
/ 22 июля 2010
IQueryable<Product> query = db.Products
  .Where(p => SearchFeatures
    .All(sf =>
      p.ProductFeatures.Select(pf => pf.Feature).Contains(sf)
    )
  );
1 голос
/ 22 июля 2010

Как-то так должно работать

public partial class Product
{
    public IEnumerable<Feature> Features
    {
        get
        {
            return ProductFeatures.SelectMany(pf => pf.Feature);
        }
    }
}

Products.Where(p => SearchFeatures.All(sf => p.Features.Count(f => f.ID == sf.ID) > 0));
0 голосов
/ 26 июля 2015

Не уверен, что его не было в 2010 году, но теперь вы можете сделать что-то вроде:

var myArray = new[] { 2, 3 };
q = myArray.Aggregate(q, (current, myArrayItem) => current.Where(x => x.Producs.Any(y => y.Id == myArrayItem)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...