2013-12-19 4 views
1

Я пытаюсь перевести этот SQL запрос в LINQ:LINQ к SQL с JOIN, GROUP BY, HAVING и MAX

SELECT 
     T1.FileID, 
     MAX(T1.Date) AS MaxDate 
FROM  
     T1 
     JOIN 
     T2 ON T1.Code = T2.Code 
WHERE 
     T2.Category = 'C100' 
GROUP BY 
     T1.FileID 
HAVING 
     T1.FileID LIKE 'F01%' 

я получаю все даты, а не только Макс каждой даты в FILEID с использованием это:

var query = 

    from f in db.T1 
    join c in db.T2 on f.Code equals c.Code 
    group f by new { f.FileID, f.Date, c.Category } into g 
    where g.Key.FileID.StartsWith("F01") && g.Key.Category.Equals("C100") 
    select new 
    { 
     g.Key.FileID, 
     MaxDate = g.Max(d=>d.Date) 
    } 

Это кажется более сложным, чем необходимо. Как я могу это исправить?

+0

почему в SQL группировать только от 'FileID' но в LINQ 'f.FileID, f.Date, c.Category'? – Grundy

+0

Поскольку я не знаю, как использовать группу LINQ ... –

ответ

3

Почему ваш SQL содержит только один столбец в предложении GROUP BY, а запрос LINQ имеет три столбца?

Вы должны также переместить оператор where до group by в свой запрос LINQ.

var query = 
    from f in db.T1 
    join c in db.T2 on f.Code = c.Code 
    where c.Category = "C100" 
    group f by f.FileID into g 
    where SqlMethods.Like(g.Key, "F01%") 
    select new 
    { 
     FileID = g.Key, 
     MaxDate = g.Max(d => d.Date) 
    } 
+0

Как только я изменил оператор группы, g.FileID не существует в инструкции select. Ошибка: «System.Linq.IGrouping » не содержит определения для «FILEID» и никакого метода расширений ... –

+0

@nethy Заменить 'g.Key.FileID' на' FileID = g.Key 'внутри' select' части запроса. – MarcinJuraszek

+0

Также, где бы я поместил мое условие HAVING: m.FileID.StartsWith («F01»)? –

2

изменить ваш LINQ с этим:

при написании запроса Linq вам нужно запомнить порядок можно определить форматы

var query = (from f in db.T1 
       join c in db.T2 on f.Code = c.Code 
       where c.Category = "C100" 
       group f by f.FileID into g 
       select new 
       { 
        FileID = g.Key, 
        MaxDate = g.Max(d=>d.Date) 
       }); 
+1

@MarcinJuraszek, который нежелателен, что не нужно определять. см. здесь g.Key.FileID, –

+0

Ну, согласитесь, есть небольшое исправление –