Фактически вам не нужно использовать отдельный выбор, используя одну из перегрузок метода GroupBy, вы можете использовать параметры «keySelector» и «resultSelector» для объединения как группы, так и суммы.
GroupBy - действительно мощный метод, который может быть довольно сложным на первый взгляд, но как только вы обходите вокруг, он довольно прямолинейный и чрезвычайно универсальный.
Вот пример, он создает список WorkOrderItems, по одному для каждой группы, с агрегированными результатами; а не возвращать список анонимных объектов. Вы можете расширить это с несколькими ключевыми селекторов (группы по статьям) и делать всякие суммирования и манипуляции результирующего объекта (ов) ...
class Program
{
static void Main(string[] args)
{
var myItems = new List<WorkOrderItem>
{
new WorkOrderItem { OrderId = 1, ItemName = "A", ItemQuantity = 0 },
new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 1 },
new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 2 },
new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 3 },
new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 4 },
new WorkOrderItem { OrderId = 1, ItemName = "B", ItemQuantity = 5 },
new WorkOrderItem { OrderId = 0, ItemName = "C", ItemQuantity = 6 },
};
int myId = 0;
List<WorkOrderItem> groupedItems =
myItems.Where(i => i.OrderId == myId)
.GroupBy(
//key selector
i => i.ItemName,
//result selector
(name, items) =>
{
var aggregatedItem = new WorkOrderItem
{
OrderId = myId,
ItemName = name,
ItemQuantity = items.Sum(i => i.ItemQuantity)
};
return aggregatedItem;
})
.ToList();
}
class WorkOrderItem
{
public int OrderId { get; set; }
public string ItemName { get; set; }
public int ItemQuantity { get; set; }
}
}
Для дальнейшего чтения на одном из самых недооцененных методов в Linq Я очень рекомендую взглянуть на это сообщение в блоге от Jon Skeet: http://codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-objects-part-21-groupby/
Какая ошибка? – Magnus
Ссылка на объект не установлена в экземпляр объекта. Я думаю, это означает, что запрос не вернул значение? – user1287453
Это означает, что он разбился перед возвратом любых значений. – Magnus