Linq - 通过子对象中的属性相交2个列表

时间:2016-11-16 16:38:22

标签: c# linq

我正在尝试合并两个列表..当我将ProductsList1.Product.IdProductList2.Product.Id合并时,我经常成功完成此操作,但在这种情况下,它更像ProductsList.Product.Id { {1}}。第3级属性就是让我感受到的!

ProductCategoriesList.ProductCategory.ProductId

2 个答案:

答案 0 :(得分:2)

以下查询将完成工作:

var result  =   products.Join(allProductCategories, p => p.Id, 
                              pc => pc.ProductId, (p, pc) => new { p, pc})
                            .GroupBy(x => x.p.Id)
                            .Select(x => new Product{ Id = x.Key, ProductCategories = x.Select(y => y.pc).ToList()});
  

要求:

  • 从两个具有常见ID的不同列表中获取数据,并创建合并版本,其中包含父Product的ID以及ProductCategory
  • 的所有匹配行

<强>解释

  • 内部加入ID
  • 上的两个列表
  • Groupby ProductId汇总ProductCategory数据
  • 在单独的集合中选择它们,其中Id是密钥,数据是所有汇总/分组结果的集合

您可以使用Linqpad和result.Dump()运行它,将提供最终结果的清晰视图

答案 1 :(得分:0)

// LIST OF PRODUCTS IN RESULT SETS
List<Product> products = new List<Product> {
    new Product() {Id = 1, ProductCategories = new List<ProductCategory>()}, 
    new Product() {Id = 2, ProductCategories = new List<ProductCategory>()}
};

// LIST OF ALL PRODUCTS AND THEIR CATEGORY TAXONOMIES
List<ProductCategory> allProductCategories = new List<ProductCategory>
{
    new ProductCategory() {ProductId = 1, CategoryUid = 101, ParentCategoryUid = 30},
    new ProductCategory() {ProductId = 1, CategoryUid = 30, ParentCategoryUid = 2},
    new ProductCategory() {ProductId = 1, CategoryUid = 2, ParentCategoryUid = 1},
    new ProductCategory() {ProductId = 3, CategoryUid = 101, ParentCategoryUid = 43},
    new ProductCategory() {ProductId = 3, CategoryUid = 43, ParentCategoryUid = 8},
    new ProductCategory() {ProductId = 3, CategoryUid = 8, ParentCategoryUid = 1}
};

// General logic going on here:
// Add all ProductCategory where the ProductID is equal
// to the Prdoduct.ID to the current Product.ProductCategories
products.ForEach(pr=>
    allProductCategories.Where(pC=>
        pC.ProductId.Equals(pr.Id)).ToList().ForEach(pC=>
            pr.ProductCategories.Add(pC)));

// products.ToList().ForEach(x=>Console.WriteLine(x.ProductCategories.Count));

输出:

  

3

     

0

我不知道使用交叉方法是否有更简单的方法,但这个方法确实有效!

根据documentation(使用Enumerable.Intersect),您需要使用多种类型实现自定义IEqualityComparer。因此,目前不可能做这样的事情,或者简单地采用比我当前解决方案更多的代码行。

如果您想了解Enumerable.Intersect的更多信息,建议您访问dotnetperls.com