Проблемы при воссоздании LINQ-запроса из SQL-скрипта - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь «перевести» SQL-запрос в запрос LINQ.Мой SQL-запрос выглядит так:

SELECT S.SummonerName, LE.LeaguePoints, LS.DateTime, SUM(LE.LeaguePoints)
FROM LadderEntries LE
JOIN Sumonners S on LE.SummonerId = S.Id
JOIN LadderSnapshots LS on LE.LadderSnapshotId = LS.Id
WHERE LS.Region = 'euw1'
AND DateTime = '2019-06-14 00:00:00'
OR DateTime = '2019-06-13 00:00:00'
and LS.Region = 'euw1'
GROUP BY S.SummonerName

Этот запрос дает мне желаемый результат.Тем не менее, до сих пор я получил следующий запрос LINQ:

from LE in _database.LadderEntries
join S in _database.Sumonners on LE.SummonerId equals S.Id
join LS in _database.LadderSnapshots on LE.LadderSnapshot.Id equals LS.Id
where LS.Region == param.Region && (LS.DateTime == param.Date || LS.DateTime == param.Date.AddDays(-1))
group new {LE, S, LS} by S.SummonerName
into C
select new GetLadderEntryDifferencesEntry
{
    LpDifference = C.Select(a => a.LE.LeaguePoints).Sum(),
    SummonerName = C.Select(a => a.S.SummonerName).FirstOrDefault()
};

Но это дает мне ошибку InvalidOperationException: Error generated for warning 'Microsoft.EntityFrameworkCore.Query.QueryClientEvaluationWarning: The LINQ expression 'GroupBy([S].SummonerName, new <>f__AnonymousType5'3(LE = [LE], S = [S], LS = [LS]))' could not be translated and will be evaluated locally.'. при выполнении.

Мне интересно, что я делаю неправильно.

Примечание. Я использую sqllite и ef core, если это имеет значение.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Хорошо, вот что я получил, сначала

LS.Region = 'euw1'
AND DateTime = '2019-06-14 00:00:00'
OR DateTime = '2019-06-13 00:00:00'
and LS.Region = 'euw1'

отличается от приведенного ниже linq, где параметры отсутствуют в sql.

&& (LS.DateTime == param.Date || LS.DateTime == param.Date.AddDays(-1))

Теперь о группе, которую вы можете попробовать сделать вместо этого

from LE in _database.LadderEntries
join S in _database.Sumonners on LE.SummonerId equals S.Id
join LS in _database.LadderSnapshots on LE.LadderSnapshot.Id equals LS.Id
where LS.Region == param.Region && (LS.DateTime == param.Date || LS.DateTime == param.Date.AddDays(-1))
group LE by new {LE.SummonerName, S.SummonerName, LS.SummonerName} 
into C
select new GetLadderEntryDifferencesEntry
{
    LpDifference = C.Select(a => a.LE.LeaguePoints).Sum(),
    SummonerName = C.Select(a => a.S.SummonerName).FirstOrDefault()
};
0 голосов
/ 17 июня 2019

Я думаю, что проблема будет с:

&& (LS.DateTime == param.Date || LS.DateTime == param.Date.AddDays(-1))

попробуйте это:

var firstDate = param.Date;
var secondDate = param.Date.AddDays(-1);

тогда

&& (LS.DateTime == firstDate || LS.DateTime == secondDate)

возможно, это может быть исключение для: SummonerName = C.Select(a => a.S.SummonerName).FirstOrDefault() или как организована группировка.

Установлены ли эти объекты со ссылками и можно ли упростить выражение?

var ladderEntryDifferences = _database.LadderSnapshots
    .Where(x =>x.Region = param.Region 
        && (x => x.DateTime == firstDate || x.DateTime == secondDate)
    .GroupBy(x => x.LadderEntry.Summoner.SummonerName)
    .Select( g => new GetLadderEntryDifferencesEntry
    {
        LpDifference = g.Sum(x => x.LeagueEntry.LeaguePoints),
        SummonerName = g.Key // This will be the SummonerName
    }).ToList();

Выше приведено предположение о структуре, которая выводит группу из памяти, но она может дать вам некоторые идеи, которые стоит попробовать. Если ваш контекст не отображает LadderSnapshots на верхнем уровне, вы также сможете составить его из уровня LadderEntry ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...