![](/img/trans.png)
[英]Extension method on ObservableCollection<MyType>, MyType : IEnumerable<MyType>
[英]Roll up totals of an ObservableCollection<MyType> with a Linq expression
我有一個Silverlight委托,該委托在EventArgs結果中獲取一個ObservableCollection。 DTO myType具有字段Order,StartDate,Status,PlannedAmount,ActualAmount以及其他幾個字段。 WCF服務端的查詢為每個訂單獲取幾行,僅因PlannedAmount和ActualAmount有所不同。
Order # | StartDate | PlannedAmount| ActualAmount | Order Comments ....
Order A | March 15 | 20.00 | 0.00 | Comment 1 ...
Order A | March 15 | 30.00 | 0.00 | Comment 1 ...
Order A | March 15 | 10.00 | 0.00 | Comment 1 ...
Order A | March 15 | 0.00 | 30.00 | Comment 1 ...
Order B | March 25 | 10.00 | 0 | Comment 2 ...
Order B | March 25 | 0.00 | 5.00 | Comment 2 ...
我只想為每個訂單顯示一行,並對所有PlannedAmount和ActualAmount值求和。 我更喜歡在表示層中更改此設置,因為我不知道WCF操作的其他使用者需要什么。 所以我想將其匯總到...
Order # | StartDate | PlannedAmount| ActualAmount | Order Comments ....
Order A | March 15 | 60.00 | 30.00 | Comment 1 ...
Order B | March 25 | 10.00 | 5.00 | Comment 2 ...
然后將其設為與我以前相同類型的ObservableCollection。
我已經嘗試過了,但是除了Key和Sum值之外,我似乎什么也沒得到。
var Orders =
from wo in OrdersPerOperation
group wo by wo.OrderNo
into g
select new
{
OrderNo = g.Key,
Planned = g.Sum(wo => wo.Planned),
Actual = g.Sum(wo => wo.Actual),
OrderComments = g.Select(wo => wo.Equipment),
StartDate = g.Select(wo => wo.StartDate),
Status = g.Select(wo => wo.Status),
OrderType = g.Select(wo => wo.OrderType) //,...
};
編輯
僅獲得密鑰和兩個和就很簡單:
var Orders =
from wo in OrdersPerOperation
group wo by wo.OrderNo
into g
select new
{
OrderNo = g.Key,
Planned = g.Sum(wo => wo.Planned),
Actual = g.Sum(wo => wo.Actual)
}
挑戰在於獲取所有其他字段,這些字段必須重復顯示在結果中。
編輯
我猜想這可能像自引用SQL查詢一樣工作。 我相信我在這方面是正確的,因為每個元素都具有正確格式的數據。 在所有這種Linq混亂之前,我仍然無法將結果設置為Silverlight網格的ItemsSource,可以綁定該項目。 IDE警告我,FirstOrDefault是可能的NullReferenceException。
var workOrders = from wo in workOrdersPerOperation
group wo by wo.OrderNo
into g
select new
{
OrderNo = g.Key,
Planned = g.Sum(wo => wo.Planned),
Actual = g.Sum(wo => wo.Actual),
g.FirstOrDefault(wo => wo.OrderNo == g.Key).Location,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).Equipment,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).StartDate,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).Status,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).OrderType,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).AccType,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).WorkCenter,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).Description,
g.FirstOrDefault(wo => wo.OrderNo == g.Key).Priority
};
有人可以讓我越過這一步嗎? 我仍然需要將其綁定到控件。
您需要g.SelectMany(wo => wo.Equipment)
。
嘗試:
OrderComments = g.Select(wo => wo.Equipment).ToList()
我發現我可以選擇帶有初始化程序的MyClass新實例的集合。
var orders = from wo in ordersPerOperation
group wo by wo.OrderNo
into g
select new MyType()
{
OrderNo = g.Key,
Planned = g.Sum(wo => wo.Planned),
Actual = g.Sum(wo => wo.Actual),
Location = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Location,
Equipment = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Equipment,
StartDate = g.FirstOrDefault(wo => wo.OrderNo == g.Key).StartDate,
Status = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Status,
OrderType = g.FirstOrDefault(wo => wo.OrderNo == g.Key).OrderType,
AccType = g.FirstOrDefault(wo => wo.OrderNo == g.Key).AccType,
WorkCenter = g.FirstOrDefault(wo => wo.OrderNo == g.Key).WorkCenter,
Description = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Description,
Priority = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Priority
};
這不是ObservableCollection,但事實證明我根本不需要它。
我很確定
Location = g.FirstOrDefault(wo => wo.OrderNo == g.Key).Location,
將產生與此相同的結果
Location = g.FirstOrDefault().Location,
此外,如果您的集合可能為空,則僅需要使用FirstOrDefault
。 但是,如果其中沒有項目,則該組將不存在。 這使您可以簡化它。
Location = g.First().Location,
您可以制定最終解決方案
var orders = from wo in ordersPerOperation
group wo by wo.OrderNo
into g
select new MyType
{
OrderNo = g.Key,
Planned = g.Sum(wo => wo.Planned),
Actual = g.Sum(wo => wo.Actual),
Location = g.First().Location,
Equipment = g.First().Equipment,
StartDate = g.First().StartDate,
Status = g.First().Status,
OrderType = g.First().OrderType,
AccType = g.First().AccType,
WorkCenter = g.First().WorkCenter,
Description = g.First().Description,
Priority = g.First().Priority
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.