Linq查询集合中的一个集合,来自另一个集合

时间:2011-09-13 11:34:15

标签: c# linq

我有类似这个模型的东西:

public class Product
{
  public int ID { get; set; }
  public string Name { get; set; }

  public ICollection<ProductVariation> Variations { get; set; }
}


public class ProductVariation
{
  public int VariationID { get; set; }
  public string Size { get; set; }
  public bool InStock { get; set; }
}

我有一个产品清单 - 名为“availableProducts”

List<Product> availableProducts;

然后我还有一个int - requestedVariationNumbers列表:

List<int> requestedVariationNumbers;

我要做的是从 availableProducts 获取产品,其中Product.Variations集合包含 requestedVariationNumbers 中的 VariationID

到目前为止,我有这个: (由ReSharper根据一系列丑陋的foreach语句生成......)

这对我来说似乎“肮脏”......

    var result = (
      from rvn in requestedVariationNumbers
      from product in availableProducts
      from itemVariation in product.ItemVariations
      where itemVariation.ItemNo == rvn
      select product)
      .ToList();

2 个答案:

答案 0 :(得分:5)

试试这个:

var result = availableProducts.Where(p => p.Variations
                                           .Any(v => requestedVariationNumbers
                                                     .Contains(v.VariationID)));

这不是很有效。如果requestedVariationNumbersHashSet会更好,因为在最坏的情况下,每个产品的每个变体都会调用requestedVariationNumbers.Contains(v.VariationID),而在最佳情况下,每个产品的每个变体都会调用{{1}}。

答案 1 :(得分:1)

使用Intersect的方法:

var result = 
    from product in availableProducts
    let variationIds = from v in product.Variations select v.VariationID
    where variationIds.Intersect(requestedVariationNumbers).Any()
    select product;

您可以ToList()result这里IEnumerable<Product>