簡體   English   中英

匯總一個ObservableCollection的總數 <MyType> 帶有Linq表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM