Linq to SQL Filter Matches - PullRequest
       5

Linq to SQL Filter Matches

1 голос
/ 10 июня 2011

Я знаком с основными запросами в 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 ]

1 голос
/ 10 июня 2011

Похоже, вы на самом деле не ищете фильтр , а min - в этом случае минимальное количество ходов для каждой уникальной комбинации головоломки иuser.

В 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)
          };
1 голос
/ 10 июня 2011
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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...