代码之家  ›  专栏  ›  技术社区  ›  Aaron

linq many to many地狱-查询包含所有

  •  4
  • Aaron  · 技术社区  · 14 年前

    我有一个多对多的关系,如下所示:

    产品 产品目录 描述

    产品特性 产品特征ID 产品目录 特征码

    特征 特征码 描述

    任何产品都有许多特性。

    然后,我带来了一个称为“SearchFeatures”的iQueryable,它包含两个我想要搜索的特定功能对象。

    我想找到所有这些功能的产品!

    例如,这样的事情会很好:

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

    使用LINQ最干净的方法是什么?

    多谢。

    5 回复  |  直到 9 年前
        1
  •  5
  •   Francisco    14 年前
    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
  •  2
  •   Devid G    14 年前
    from item in db.Products
    where item.ProductFeatures.Where(x=>featIdList.Contains(x.FeatureId)).Count() == featIdList.Count
    select item
    

    应该这样做。FeatureList是您要查找的功能ID的列表

        3
  •  1
  •   David Hedlund    14 年前

    像这样的东西应该管用

    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));
    
        4
  •  1
  •   Amy B    14 年前
    IQueryable<Product> query = db.Products
      .Where(p => SearchFeatures
        .All(sf =>
          p.ProductFeatures.Select(pf => pf.Feature).Contains(sf)
        )
      );
    
        5
  •  0
  •   Marthijn    9 年前

    不确定它是否在2010年就不存在了,但是现在您可以做如下的事情:

    var myArray = new[] { 2, 3 };
    q = myArray.Aggregate(q, (current, myArrayItem) => current.Where(x => x.Producs.Any(y => y.Id == myArrayItem)));