C# Linq-按子对象中的属性相交2个列表

C# Linq-按子对象中的属性相交2个列表,c#,linq,C#,Linq,我正在尝试合并两个列表。。当我将ProductsList1.Product.Id之类的东西与ProductList2.Product.Id合并时,我通常会成功地执行此操作,但是在这种情况下,它更像是ProductsList.Product.Id与ProductCategoriesList.ProductCategory.Id合并。第三层的财产是什么让我 // LIST OF PRODUCTS IN RESULT SETS List<Product> products

我正在尝试合并两个列表。。当我将
ProductsList1.Product.Id
之类的东西与
ProductList2.Product.Id
合并时,我通常会成功地执行此操作,但是在这种情况下,它更像是
ProductsList.Product.Id
ProductCategoriesList.ProductCategory.Id
合并。第三层的财产是什么让我

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

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

    // NEED TO MERGE THE 2ND LIST INTO THE 1ST BY PRODUCTID VIA SQL EQUIV INNER JOIN
    // END RESULT SHOULD BE products list has 2 objects. one object has 1 list product category with 3 child objects
    // THIS IS THE CLOSEST I GOT
    products.Select(x => x.Id).Intersect(allProductCategories.Select(a => a.ProductId).ToList());
}

public class Product
{
    private int _id;
    private List<ProductCategory> _productCategories;

    public int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public List<ProductCategory> ProductCategories
    {
        get { return _productCategories; }
        set { _productCategories = value; }
    }
}

public class ProductCategory
{
    private int _productId;
    private int _categoryUid;
    private int _parentCategoryUid;

    public int ProductId
    {
        get { return _productId; }
        set { _productId = value; }
    }

    public int CategoryUid
    {
        get { return _categoryUid; }
        set { _categoryUid = value; }
    }

    public int ParentCategoryUid
    {
        get { return _parentCategoryUid; }
        set { _parentCategoryUid = value; }
    }
}
//结果集中的产品列表
列表产品=新列表();
Add(新产品(){Id=1});
Add(新产品(){Id=2});
//所有产品及其类别分类的列表
List allProductCategories=新列表();
添加(新的ProductCategory(){ProductId=1,CategoryUid=101,ParentCategoryUid=30});
添加(新的ProductCategory(){ProductId=1,CategoryUid=30,ParentCategoryUid=2});
添加(新的ProductCategory(){ProductId=1,CategoryUid=2,ParentCategoryUid=1});
添加(新的ProductCategory(){ProductId=3,CategoryUid=101,ParentCategoryUid=43});
添加(新的ProductCategory(){ProductId=3,CategoryUid=43,ParentCategoryUid=8});
添加(新的ProductCategory(){ProductId=3,CategoryUid=8,ParentCategoryUid=1});
//需要通过SQL EQUIV内部联接按PRODUCTID将第二个列表合并到第一个列表中
//最终结果应该是产品列表有2个对象。一个对象有1个列表产品类别和3个子对象
//这是我最近的一次
products.Select(x=>x.Id).Intersect(allProductCategories.Select(a=>a.ProductId.ToList());
}
公共类产品
{
私人内部id;
私有列表(productCategories);;
公共整数Id
{
获取{return\u id;}
设置{u id=value;}
}
公共列表产品类别
{
获取{return\u productCategories;}
设置{u productCategories=value;}
}
}
公共类ProductCategory
{
私有int_productId;
私人国际分类;
private int_parentCategoryUid;
公共int ProductId
{
获取{return\u productId;}
设置{u productId=value;}
}
公共int分类
{
获取{return\u categoryUid;}
设置{u categoryUid=value;}
}
public int ParentCategoryUid
{
获取{return\u parentCategoryUid;}
设置{u parentCategoryUid=value;}
}
}
//结果集中的产品列表
列出产品=新列表{
新产品(){Id=1,ProductCategories=new List()},
新产品(){Id=2,ProductCategories=new List()}
};
//所有产品及其类别分类的列表
List allProductCategories=新列表
{
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}
};
//一般逻辑如下:
//添加ProductID相等的所有ProductCategory
//将Prdoduct.ID添加到当前Product.ProductCategories
products.ForEach(pr=>
所有产品类别。其中(pC=>
pC.ProductId.Equals(pr.Id)).ToList().ForEach(pC=>
pr.ProductCategories.Add(pC));
//products.ToList().ForEach(x=>Console.WriteLine(x.ProductCategories.Count));

输出:

三,

0


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

根据(用于使用
Enumerable.Intersect
),您需要使用多种类型实现自定义。正因为如此,目前不可能完成这些事情,或者需要比我当前的解决方案更多的代码行

如果你想了解更多,我建议你去看看

//结果集中的产品列表
列出产品=新列表{
新产品(){Id=1,ProductCategories=new List()},
新产品(){Id=2,ProductCategories=new List()}
};
//所有产品及其类别分类的列表
List allProductCategories=新列表
{
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}
};
//一般逻辑如下:
//添加ProductID相等的所有ProductCategory
//将Prdoduct.ID添加到当前Product.ProductCategories
products.ForEach(pr=>
所有产品类别。其中(pC=>
pC.ProductId.Equals(pr.Id)).ToList().ForEach(pC=>
pr.ProductCategories.Add(pC));
//products.ToList().ForEach(x=>Console.WriteLine(x.ProductCategories.Count));

输出:

三,

0


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

根据(用于使用
Enumerable.Intersect
),您需要使用多种类型实现自定义。正因为如此,目前不可能完成这些事情,或者需要比我当前的解决方案更多的代码行


如果你想了解更多,我建议你去看看

以下查询将完成此任务:

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的不同列表中获取数据,并创建一个包含父级Id的合并版本<