2013-03-14 5 views
1

Как это сделатькак преобразовать SQL в Linq

Выберите топ 10 Foo из MyTable

SELECT  TOP (30) Item, Descripcion, SUM(Amount) AS Suma   
FROM   Venat 
GROUP BY Item, Descripcion       
ORDER BY Suma 

в Linq к SQL?

с этим только agrup по пункту, но не Описание

var filtroprimeros30 = from nuevo in registrosVipDosAños 
        group nuevo by nuevo.Item into g   
         select new 
         { 
          Item = g.Key, 
          Suma = g.Sum(nuevo => nuevo.Amount) 

         }; 

ответ

1

Использование анонимного типа для группировки:

var filtroprimeros30 = 
    (from nuevo in registrosVipDosAños 
     group nuevo by new { nuevo.Item, nuevo.Description } into g // here  
     select new { 
      g.Key.Item, 
      g.Key.Description, 
      Suma = g.Sum(n => n.Amount) 
     }) 
    .OrderBy(x => x.Suma) 
    .Take(30); 

Я бы на самом деле идти этот путь (поскольку синтаксис запроса имеет хороший синтаксис для группировки, но не имеют возможности принимать N элементов):

var items = from n in registrosVipDosAños 
      group n by new { n.Item, n.Description } into g 
      select new { 
       g.Key.Item, 
       g.Key.Description, 
       Suma = g.Sum(x => x.Amount) 
      }; 

var topItems = items.OrderBy(x => x.Suma).Take(30); 

Запрос все равно будет выполнен только один раз, но теперь он более читабельен.

+0

насчет добавления 'OrderBy g.Sum (п => n.Amount)' между группой и выбрать? – Aducci

+0

@ SQL-код, созданный Aducci, будет содержать два столбца «Сумма (сумма)» - один для упорядочения и один для результата. (согласно LinqPad) –

+0

Привет, все работает, но ordey от Suma donts работает – user1178740

1

синтаксис альтернативный

var filtroprimeros30 = registrosVipDosAnos 
         .GroupBy(m => new {m.Item, m.Description}) 
         .Select(g => new { 
          Item = g.Key.Item, 
          Description = g.Key.Description, 
          Suma = g.Sum(n => n.Amount) 
         }) 
         .OrderBy(x => x.Suma) 
         .Take(30); 
Смежные вопросы