【问题标题】:Linq query collection within a collection, from another collection一个集合中的 Linq 查询集合,来自另一个集合
【发布时间】:2011-09-13 21:10:07
【问题描述】:

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

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();

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    试试这个:

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

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

    【讨论】:

    • 不错!如果需要额外的速度,那么 HashSet 很容易创建。 var reqset = new HashSet&lt;int&gt;(requestedVariationNumbers);
    【解决方案2】:

    使用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&lt;Product&gt;

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2012-03-31
      • 2011-10-05
      • 2012-08-27
      • 2016-05-09
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 1970-01-01
      相关资源
      最近更新 更多