【问题标题】:Linq to SQL Filter MatchesLinq to SQL 过滤器匹配
【发布时间】:2011-06-11 06:24:39
【问题描述】:

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

也就是说,这两个将被从结果中过滤掉,因为它们是由同一个用户和同一个谜题,但有更多的移动。

【问题讨论】:

  • 如果同一用户/拼图组合有 3 条记录,您希望看到什么?还是他们总是单身还是成对?

标签: sql linq-to-sql filter


【解决方案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());

【讨论】:

    【解决方案2】:

    在我看来,您实际上并不是在寻找 过滤器,而是在寻找 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)
              };
    

    【讨论】:

    • 这是正确的,除了 LINQ,它将是 g.Key.UserIdg.Key.PuzzleID。此外,UserId 上的 Where 意味着您可以按 PuzzleID 分组。
    • 是的,你完全正确,我忘记了分组结构下所有重要的 .Key。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多