0

Здравствуйте у меня есть вопрос с запросами в Entity FrameworkGroupBy/Sum вопрос запрос с Entity Framework

Мой Родитель Деталь workorders

Мой ребенок деталь workorderitems

Я хотел бы, чтобы выбрать все элементы из таблица workorderitems, где столбец workorder_id соответствует моей переменной varialble (myid). Результаты должны быть сгруппированы по наименованию товара, а количество должно быть суммировано.

Кроме того, если я удалю заявление GroupBy и Select, запрос действительно возвращается обратно результаты Однако с заявлениями GroupBy и Select я получаю сообщение об ошибке.

Ниже мой синтаксис:

var workorderitems= DBContext.WorkOrderItems 
.Where(o => o.workorder_id == myid) 
.GroupBy(grp => new { grp.ItemName }) 
.Select(result => new { itemname = result.Key.ItemName, qty = result.Sum(o => o.ItemQuantity) }); 



    var mycount = workorderitems.Count(); 

Может кто-то дайте мне знать, если мой synatax кажется правильным?

+0

Какая ошибка? – Magnus

+0

Ссылка на объект не установлена ​​в экземпляр объекта. Я думаю, это означает, что запрос не вернул значение? – user1287453

+0

Это означает, что он разбился перед возвратом любых значений. – Magnus

ответ

0

Фактически вам не нужно использовать отдельный выбор, используя одну из перегрузок метода 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/

Смежные вопросы