Можно ли преобразовать / продублировать следующее с помощью Linq?
DECLARE @UserID INT = 1, @ViewerUserID INT = 1002;
SELECT UGR.*,
CASE
WHEN (
SELECT subR.[Level]
FROM UserGameRanks subUGR WITH (NOLOCK)
INNER JOIN Ranks subR WITH (NOLOCK) ON (subUGR.RankId = subR.Id)
INNER JOIN Games subG WITH (NOLOCK) ON (subUGR.GameId = subG.Id)
INNER JOIN Users subU WITH (NOLOCK) ON (subUGR.UserID = subU.Id)
WHERE subUGR.IsDeleted = 0 AND subU.Id = @ViewerUserID AND subUGR.GameID = UGR.GameId
) > R.[Level] THEN 1
ELSE 0
END AS CanEdit
FROM UserGameRanks UGR WITH (NOLOCK)
INNER JOIN Ranks R WITH (NOLOCK) ON (UGR.RankId = R.Id)
INNER JOIN Games G WITH (NOLOCK) ON (UGR.GameId = G.Id)
INNER JOIN Users U WITH (NOLOCK) ON (UGR.UserID = U.Id)
WHERE UGR.IsDeleted = 0 AND U.Id = @UserID
AND
(
(
(@ViewerUserID <> - 1)
AND
(UGR.VisibilityId = 1)
)
OR
(
(UGR.VisibilityId = 2)
)
OR
(
(UGR.VisibilityId = 0)
AND
(@UserID = @ViewerUserID)
)
)
В частности, подзапрос CASE? Я добавил значение [NotMapped] CanEdit в класс сущности Users, однако я не уверен, как заполнить его одним sql-запросом, вместо того, чтобы выполнить первоначальное получение первым, после чего цикл и обновление CanEdit.
Я просмотрел StackOverflow.
Буду признателен за любую помощь.
РЕДАКТИРОВАТЬ: глядя на ваши ответы, я вижу, как это сделать, но я понял, что сделал вопрос в вопросе. Я изначально создал вышеупомянутый запрос в качестве примера для моей проблемы, но теперь я вижу, что он не имеет прямого отношения к моей проблеме. Я обновил часть SQL ...
Идея состоит в том, что у нас может быть много рангов с наименьшим рангом, равным «Unset», то есть уровнем 0. Так что, если я играю в игру, в которую играет другой пользователь, и мне задан мой ранг на уровне 2, я могу назначить ранг этому пользователю до 1. Но в другой игре я также мог бы быть "Unset" (уровень 0) и, следовательно, не смог бы редактировать его / ее ранг.
@ CodingYoshi: Это то, что я пытался
var viewerQuery = from ugr in context.UserGameRanks
join r in context.Ranks on ugr.RankId equals r.Id
join g in context.Games on ugr.GameId equals g.Id
join u in context.Users on ugr.UserId equals u.Id
where (!ugr.IsDeleted) && (ugr.UserId == viewerUserId)
select new { UserGameRank = ugr };
var query = from ugr in context.UserGameRanks
join r in context.Ranks on ugr.RankId equals r.Id
join g in context.Games on ugr.GameId equals g.Id
join u in context.Users on ugr.UserId equals u.Id
where (!ugr.IsDeleted) && (ugr.UserId == userId) &&
(
(viewerUserId != -1 && ugr.VisibilityId == Visibility.RegisteredUsers)
||
(ugr.VisibilityId == Visibility.Public)
||
(ugr.VisibilityId == Visibility.Hidden && userId == viewerUserId)
)
select new { GameName = g.Name, Username = ugr.Username, RankName = r.Name, CanEdit = (viewerQuery.Rank.Level > r.Level ? 1 : 0) };