【发布时间】:2019-04-14 15:28:22
【问题描述】:
是否可以使用 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 子查询?我向 Users 实体类添加了一个 [NotMapped] CanEdit 值,但是我不确定如何使用一个 sql 查询填充它,而不是先执行初始获取,然后循环并更新 CanEdit。
我看过 StackOverflow。
我们将不胜感激。
编辑:查看您的答案,我知道该怎么做,但我意识到我在问题中编造了一个东西。我最初创建了上述查询作为我的问题的示例,但我现在看到它与我的问题没有直接关系。我已经更新了 SQL 部分...
我们的想法是我们可能有许多排名,其中最低排名是“未设置”,这将是 0 级。因此,如果我玩另一个用户玩的游戏并且我的排名设置为 2 级,我可以分配排名将此用户设置为 1。但在不同的游戏中,我也可能是“未设置”(级别 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) };
【问题讨论】:
-
对于 case 部分,使用 c# 三元运算符,如 here 所示。你想做的就是直截了当,你有没有尝试过?
-
查看我的编辑:3 我会看看那个。
标签: c# sql linq subquery sql-to-linq-conversion