我无法针对以下情况提出linq查询。
public class Product
{
public virtual string ProductName { get; set; }
public virtual IList<SubProduct> SubProducts { get; set; }
}
public class SubProduct
{
public string SubProductName { get; set; }
public int SubProductTypeId { get; set; }
}
public class SubProductType
{
public int SubProductTypeId{ get; set; }
public string Description { get; set; }
}
var productList = List<Product>();
var subProductTypeLlist = List<SubProductType>();
我有一个产品清单,每个产品都有子产品清单。我想让查询代表{ProductName,Description}。请建议如何编写linq查询。
答案 0 :(得分:1)
这样的事情可以解决问题:
var result = productList
.SelectMany(p => p.SubProducts
.Select(sp => new { SubProduct = sp, ProductName = p.ProductName }))
.Select(sp =>
new { Description = subProductTypeList
.Single(spt => spt.SubProduct.SubProductTypeId == sp.SubProductTypeId).Description,
ProductName = sp.ProductName })
在SelectMany中,我们首先对内部IEnumerable(IList实现IEnumerable)执行Select操作,将每个SubProduct对象转换为包含SubProduct对象和ProductName的匿名类。然后,SelectMany将其转换为平面列表。然后我们使用该列表上的Select再次创建一个新的匿名类,这次我们从subProductTypeList中获取Description。结果是具有成员Description和ProductName的匿名类的IEnumerable。