2011-06-10 103 views
1

我熟悉SQL中的基本查詢,但我需要應用過濾器,並且我不完全確定如何去解決這個問題。Linq to 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 

也就是說,這兩個將被過濾出結果b因爲它們是由同一個用戶和同一個謎題組成的,但是具有更多的移動次數。

+0

什麼,你希望看到如果你有3個紀錄爲相同的用戶/拼圖組合?或者他們會一直是單身還是雙人? – Ocelot20 2011-06-10 18:44:34

回答

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

看起來像你對我實際上並沒有尋找過濾,但分鐘值 - 在這種情況下,對拼圖和用戶的每一個獨特的組合動作的最小數量。

在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

這是正確的,除了LINQ,它會是'g.Key.UserId'和'g.Key.PuzzleID'。另外,'UserId'上的'Where'意味着你可以通過'PuzzleID'進行分組。 – Mig 2011-06-10 18:47:26

+0

是的,你是完全正確的,我忘記了分組結構下的所有重要的.Key。 – 2011-06-10 19:21:07