EDIT: упрощенная проблема и уточненный вопрос.
Я пытаюсь преобразовать эту хранимую процедуру в оператор LINQ:
SELECT UserID, MAX(RowID) as RowID into #tempa
FROM Users
WHERE Approved = 1
GROUP BY UserID
SELECT (bunch of columns)
FROM Users INNER JOIN #tempa
ON (Users.UserID = #tempa.UserID AND Users.RowID = #tempa.RowID)
DROP TABLE #tempa
Когда я запускаю этот SPROC, я получаю 292 строки.Когда я пытаюсь преобразовать его в LINQ, я делаю следующее:
IQueryable<User> userQuery = db.Users.Where(x => x.Approved == true);
userQuery = userQuery.Where((x => x.RowID ==
db.Users.Where(u => u.UserID == x.UserID).Max(u => u.RowID)
));
IList<User> users = userQuery.ToList();
Результат - 293 строки ...
Теперь я меняю SPROC на (это битовая маска, где значение 2 активно):
SELECT UserID, MAX(RowID) as RowID into #tempa
FROM Users
WHERE Approved = 1 AND (UserAttribtues & 2) = 2
GROUP BY UserID
SELECT (bunch of columns)
FROM Users INNER JOIN #tempa
ON (Users.UserID = #tempa.UserID AND Users.RowID = #tempa.RowID)
DROP TABLE #tempa
Я получаю 289 строк с помощью sproc.
Попробуйте следующее с LINQ:
IQueryable<User> userQuery = db.Users.Where(x => (x.UserAttributes & Convert.ToInt32(UserAttributes.Active)) == Convert.ToInt32(UserAttributes.Active) && x.Approved == true);
userQuery = userQuery.Where((x => x.RowID ==
db.Users.Where(u => u.UserID == x.UserID).Max(u => u.RowID)
));
Результат - 127 строк ....
Сначала я подумал, что в подзапросе я использовал .Max, и AD.NET исправил меня ниже, но цифры все еще далеко, что мне здесь не хватает?Я чего-то не понимаю ...