Linq to SQL Filter Matches

时间:2011-06-10 18:20:56

标签: sql linq-to-sql filter

我熟悉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

也就是说,这两个将从结果中滤除,因为它们是由同一个用户和同一个谜题组成,但移动次数更多。

2 个答案:

答案 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)
          };