9999Dave Ответов: 1

C# написание оператора linq group by и having


Мне нужно написать инструкцию sql:

SELECT        memberid, spid, Score
FROM            Mem_Gifts AS e
WHERE        (Score =
                             (SELECT        MAX(Score) AS Expr1
                               FROM            Mem AS w
                               GROUP BY memberid
                               HAVING         (e.memberid = memberid)))


к линку. У меня проблемы с обладанием. Добавление where в конце дает мне ошибку. Тип или пространство имен "где" не удалось найти.

Что я уже пробовал:

var maxScore2 = (from c in storeDB.Mem
                                         group c by new { c.memberid, c.spid, c.Score } into g
                                         select new
                                         {
                                             g.Key,
                                             Score = (from t2 in g select t2.Score).Max()
                                         }) where c.memberid = g.memberid;

1 Ответов

Рейтинг:
4

Richard Deeming

Начните с упрощения SQL-запросов :

SELECT 
    memberid, 
    spid, 
    score
FROM 
    Mem_Gifts As e
WHERE 
    score = 
    (
        SELECT MAX(w.score) 
        FROM Mem As w 
        WHERE w.memberid = e.memberid
    )
;
Нет необходимости в этом GROUP BY или HAVING предложения, поскольку вы используете коррелированный подзапрос.

Чтобы получить аналогичный результат в LINQ, попробуйте что - то вроде этого:
var result = storeDB.MemGifts
    .Where(e => e.Score == storeDB.Mem.Where(w => w.MemberId == e.MemberId).Max(w => w.Score))
    .Select(e => new { e.MemberId, e.Spid, e.Score });


Maciej Los

5ed!

9999Dave

Это сработало. Мой единственный комментарий-Это Mem_Gifts в моем, и пример должен быть Mem. Typeo мной. Все это прекрасно работало!

Richard Deeming

Если это тот же самый стол, то вы должны быть в состоянии сделать:

var result = storeDB.Mem
    .GroupBy(e => e.MemberId, (key, list) => list.OrderByDescending(e => e.Score).First())
    .Select(e => new { e.MemberId, e.Spid, e.Score });
Или, если Entity framework не может преобразовать это в SQL-запрос, то:
var result = storeDB.Mem
    .GroupBy(e => e.MemberId)
    .Select(group => group.OrderByDescending(e => e.Score).First())
    .Select(e => new { e.MemberId, e.Spid, e.Score });

9999Dave

Я просто изменил storeDB.MemGifts на storeDB.Mem в первом ответе, и это сработало нормально.