我有两个不同的类,如下所示:
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。这是可能的,如果你能指出我的方向,我真的很感激。谢谢。
答案 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)
由于ProductDto
和OrderItemsDto
都实现了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 */ };