如果类型不同,如List <t>和List <g>,可以加入两个列表吗?

时间:2015-07-09 14:21:56

标签: 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 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<OrderItemsDto>List<ProductDto>加入parentproductid(如果它们是数据库表)并生成另一个列表。

我尝试过使用Union,如下所示:

List<ProductDto> productParents = productManager.getList();
List<OrderItemsDto> orderItemsList = ordermanager.getList();
gvPurchaseOrderItems.DataSource =  orderItemsList.Select(o => o.Parentproductid).Union(productParents.Select(pp => pp.parentproductid));

但是这只给了我两个列表中找到的List<int>父产品的结果,我需要两个类中都有属性(上例中的列)的东西。我无法找到如何使用Select扩展方法选择多个属性(我是一个初学者)

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

3 个答案:

答案 0 :(得分:4)

您可以使用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 */ }));

答案 1 :(得分:2)

由于ProductDtoOrderItemsDto都实现了IDto接口,因此您无需使用匿名类型,这应该可行:

gvPurchaseOrderItems.DataSource =  orderItemsList.Cast<IDto>().Union(productParents);

所有常见属性(即在我假设的接口中定义)将与那些使用另一个角色的类型特定属性一起存在。

根据你的评论(以及它是DTO的事实,愚蠢的我),你一定要去找Dave Bish的答案。

答案 2 :(得分:1)

如果您想将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 */ };