我有以下類主/細節:LINQ查詢扁平化與子細節
public class Order
{
public Order()
{
Items = new ObservableCollection<OrderItem>();
}
public string Code { get; set; }
public ICollection<OrderItem> Items { get; set; }
}
public class OrderItem
{
public OrderItem()
{
SubItems = new ObservableCollection<SubItem>();
}
public decimal Quantity { get; set; }
public decimal Price { get; set; }
public ICollection<SubItem> SubItems { get; set; }
}
public class SubItem
{
public DateTime Date { get; set; }
public decimal Quantity { get; set; }
public string UserName { get; set; }
}
現在我的問題是,我想顯示在一個DataGrid,如這些類的所有數據。使用代碼:
Order order = new Order();
order.Code = "123";
order.Items.Add(new OrderItem()
{
Price = 30,
Quantity = 3,
SubItems = new Collection<SubItem>()
{
new SubItem() { Date = DateTime.Now, Quantity = 1, UserName = "User1" },
new SubItem() { Date = DateTime.Now, Quantity = 2, UserName = "User2" }
}
});
order.Items.Add(new OrderItem()
{
Price = 500,
Quantity = 50,
SubItems = new Collection<SubItem>()
{
new SubItem() { Date = DateTime.Now, Quantity = 20, UserName = "User1" },
new SubItem() { Date = DateTime.Now, Quantity = 20, UserName = "User2" },
new SubItem() { Date = DateTime.Now, Quantity = 10, UserName = "User3" }
}
});
我需要顯示在一個DataGrid是這樣的:
| Order.Code | Item.Price | Item.Quantity | SubItem.Quantity | SubItem.UserName |
| 123 | 30 | 3 | 1 | User1 |
| 123 | 30 | 3 | 2 | User2 |
| 123 | 500 | 50 | 20 | User1 |
| 123 | 500 | 50 | 20 | User2 |
| 123 | 500 | 50 | 10 | User3 |
看起來很簡單,但我不能這樣做。我能做的最好的方法是在SubItem
上加上OrderItem
的引用,這樣我就可以在列數據綁定上使用它,但只有當我有子項時(如果沒有SubItems
,我仍然需要顯示OrderItem
數據)才能使用它。所以基本上我需要顯示我看到的確切的東西,如果我執行一個SQL SELECT加入3個表。
任何linq魔術都可以做到這一點?
這看起來不錯,但如果OrderItem沒有子項目,它不會出現在結果上。我能夠使用'Concat'和另一個沒有'from subItem ...'和'where!item.SubItems.Any()'的查詢來做到這一點,但它看起來不很優雅:( – adanlif 2013-02-12 12:33:37
我已經更新了我的答案包括任何子集合爲空的情況 – 2013-02-12 12:47:14
真棒,謝謝! – adanlif 2013-02-12 13:49:24