У меня проблемы с созданием предложения IN с использованием C # и lambdas.
У меня есть следующий метод GetUserList(string filtersByRoles)
Переменная string filtersByRoles
может содержать значение, разделенное запятыми, например: «1,2» или «1,2,3» или «1,3,4» и т. Д. ... каждое число представляет собой уникальное число Роль (другими словами, RoleId).
У меня есть следующий лямбда-запрос C #:
var query = _userRepository.GetUserList();
Возвращает IQueryable<User>
, где User
- это таблица из моей EntityFramework.
После того, как я проверю, не является ли параметр filtersByRoles
пустым или пустым, мне нужно сделать предложение IN
, например:
if (!string.IsNullOrEmpty(filtersByRoles))
{
//Convert *filtersByRoles* to an array of integers
int[] myArray = filtersByRoles.Split(',').Select(x => int.Parse(x)).ToArray();
//Make the IN clause
query = query.Where(u => myArray.Contains(u.RoleId));
}
Приведенный выше код компилируется ... но при RUNTIME происходит сбой со следующим сообщением об ошибке:
LINQ to Entities не распознает метод 'Boolean
Содержит [Int32] (System.Collections.Generic.IEnumerable`1 [System.Int32],
Int32) ', и этот метод не может быть переведен в магазин
выражение.
Мне удалось найти обходной путь, но он включает в себя вызов метода .ToList()
, который, как я считаю, извлекает все данные из моей базы данных, а затем добавляет предложение Where ().
Но разве это не победит цель или не создаст некоторые проблемы с производительностью?
Вот что я сделал:
if (!string.IsNullOrEmpty(filtersByRoles))
{
string[] myArray = filtersByRoles.Split(',');
query = query.ToList().Where(u => myArray.Contains(u.RoleId.ToString())).AsQueryable();
}
Я бы предпочел , а не , чтобы сделать вызов .ToList()
и избежать выборки всех данных.
Есть ли другой способ добиться этого?
EDIT:
Я использую Entity Framework 1.0 и .NET Framework 3.5
Спасибо
С уважением
Винс