C# 如果类型不同(如列表),两个列表是否可以合并<;T>;和列表<;G>;?

C# 如果类型不同(如列表),两个列表是否可以合并<;T>;和列表<;G>;?,c#,linq,list,generics,lambda,C#,Linq,List,Generics,Lambda,我有两个不同的课程,如下所示: public class ProductDto : IDto { public int Parentproductid { get; set; } public string Parentproductnumber { get; set; } public int Supplierid { get; set; } //More properties } public clas

我有两个不同的课程,如下所示:

public class ProductDto : IDto
    {
        public int Parentproductid { get; set; }
        public string Parentproductnumber { get; set; }
        public int Supplierid { get; set; }
        //More properties
    }

    public class OrderItemsDto : IDto
    {
        public int Poid { get; set; }
        public System.DateTime Createddate { get; set; }
        public int Parentproductid { get; set; }
        public int Variationid { get; set; }
        public System.DateTime Deliverydate { get; set; }
        //More properties
    }
List<ProductDto> productParents = productManager.getList();
List<OrderItemsDto> orderItemsList = ordermanager.getList();
gvPurchaseOrderItems.DataSource =  orderItemsList.Select(o => o.Parentproductid).Union(productParents.Select(pp => pp.parentproductid));
我需要做的基本上是在parentproductid上加入
List
List
(就像它们是数据库表一样),并生成另一个列表

我尝试过使用
Union
如下:

public class ProductDto : IDto
    {
        public int Parentproductid { get; set; }
        public string Parentproductnumber { get; set; }
        public int Supplierid { get; set; }
        //More properties
    }

    public class OrderItemsDto : IDto
    {
        public int Poid { get; set; }
        public System.DateTime Createddate { get; set; }
        public int Parentproductid { get; set; }
        public int Variationid { get; set; }
        public System.DateTime Deliverydate { get; set; }
        //More properties
    }
List<ProductDto> productParents = productManager.getList();
List<OrderItemsDto> orderItemsList = ordermanager.getList();
gvPurchaseOrderItems.DataSource =  orderItemsList.Select(o => o.Parentproductid).Union(productParents.Select(pp => pp.parentproductid));
List productParents=productManager.getList();
List orderItemsList=ordermanager.getList();
gvPurchaseOrderItems.DataSource=orderItemsList.Select(o=>o.Parentproductid).Union(productParents.Select(pp=>pp.Parentproductid));
但这只提供了在两个列表中找到的
列表
parentProductId的结果,在这两个列表中,我需要具有两个类的属性(在上面的例子中为列)的内容。我找不到如何用selectextension方法选择多个属性(我是个初学者)


我知道我可以创建一个新类并手动映射属性,但我真的很好奇如何使用lambda表达式或linq实现这一点。如果你能给我指个方向,我会非常感激。谢谢

由于
ProductDto
OrderItemsDto
都实现了
IDto
接口,您尝试时不需要匿名类型,这应该可以:

gvPurchaseOrderItems.DataSource =  orderItemsList.Cast<IDto>().Union(productParents);
gvPurchaseOrderItems.DataSource=orderItemsList.Cast().Union(productParents);
所有公共属性(即,在我假定的接口中定义的属性)都将存在,同时使用另一个转换的特定于类型的属性也将存在


根据您的评论(事实上这是DTO,愚蠢的我),您肯定应该选择Dave Bish的答案。

因为
ProductDto
OrderItemsDto
都实现了
IDto
接口,不需要像您尝试的那样使用匿名类型,这应该可以工作:

gvPurchaseOrderItems.DataSource =  orderItemsList.Cast<IDto>().Union(productParents);
gvPurchaseOrderItems.DataSource=orderItemsList.Cast().Union(productParents);
所有公共属性(即,在我假定的接口中定义的属性)都将存在,同时使用另一个转换的特定于类型的属性也将存在


根据您的评论(事实上是DTO,傻瓜我),您肯定应该选择Dave Bish的答案。

您可以使用
Select
为您的查询创建匿名类型:

orderItemsList.Select(o => new { o.Parentproductid, o.Variationid, /* etc */ })
因此,在你的情况下:

gvPurchaseOrderItems.DataSource =  orderItemsList
    .Select(o => new { o.Parentproductid, o.Variationid, /* etc */ })
    .Union(productParents
        .Select(pp => new { pp.Parentproductid, pp.Variationid, /* etc */ }));

您可以使用
Select
为查询创建匿名类型:

orderItemsList.Select(o => new { o.Parentproductid, o.Variationid, /* etc */ })
因此,在你的情况下:

gvPurchaseOrderItems.DataSource =  orderItemsList
    .Select(o => new { o.Parentproductid, o.Variationid, /* etc */ })
    .Union(productParents
        .Select(pp => new { pp.Parentproductid, pp.Variationid, /* etc */ }));

如果要将
Parentproductid
上的两个列表合并到一个列表中,请尝试:

var result = from pm in productManager
             join om in ordermanager on pm.Parentproductid equals om.Parentproductid
             select new { pm.Parentproductid, pm.Parentproductnumber,
                          pm.Supplierid, om.Poid /* more properties */ };

如果要将
Parentproductid
上的两个列表合并到一个列表中,请尝试:

var result = from pm in productManager
             join om in ordermanager on pm.Parentproductid equals om.Parentproductid
             select new { pm.Parentproductid, pm.Parentproductnumber,
                          pm.Supplierid, om.Poid /* more properties */ };

谢谢你,我有这样的想法,但我找不到如何做。谢谢你,我有这样的想法,但我找不到如何做。没有通用属性,接口主要存在,因为后面有一个通用存储库。此外,我需要以某种方式指定将在gridView上显示的属性。我不想使用[Browsable(false)],因为我可能需要在其他页面上显示它们。没有公共属性,界面主要在那里,因为后面有一个通用存储库。此外,我需要以某种方式指定将在gridView上显示的属性。我不想使用[Browsable(false)],因为我可能需要在其他页面上显示它们。