我熟悉SQL中的基本查询,但我需要应用过滤器,我不完全确定如何去做。
我目前有这个问题:
var query = (from solvedPuzzle in db.SolvedPuzzles
where solvedPuzzle.UserID == user.ID
select solvedPuzzle);
我想修改查询或过滤结果,如此伪代码:
for each pair (a,b) of results
if a.PuzzleID == b.PuzzleID
filter out a.NumberOfMoves > b.NumberOfMoves ? a : b
如果不够简单,我将给出过滤器的示例结果
Table SolvedPuzzles:
ID UserID PuzzleID NumberOfMoves
1 2 1 5
2 2 1 6 //Will be filtered out
3 2 2 7
4 3 1 8 //Will be filtered out
5 3 1 6
6 4 2 5
7 5 2 4
也就是说,这两个将从结果中滤除,因为它们是由同一个用户和同一个谜题组成,但移动次数更多。
答案 0 :(得分:1)
var query = (from solvedPuzzle in db.SolvedPuzzles
where solvedPuzzle.UserID == user.ID
order by NumberOfMoves ascending
group solvedPuzzle by solvedPuzzle.PuzzleID into filtered
select filtered.First());
答案 1 :(得分:1)
在我看来,您实际上并不是在寻找过滤器,而是 min 值 - 在这种情况下,每个独特组合的最小移动次数谜题和用户。
在SQL中,这将是:
SELECT UserID, PuzzleID, MIN(NumberOfMoves) as UserMinForPuzzle
FROM SolvedPuzzles
GROUP BY UserID, PuzzleID
在linq中,这转化为更复杂的结构:
var query = (from sp in db.SolvedPuzzles
where sp.UserID == user.ID
group sp by new { sp.UserID, sp.PuzzleID } into g
select new {
g.UserID, g.PuzzleID, Moves = g.Min(sp => sp.NumberOfMoves)
};