Проверьте, содержит ли текст какой-либо строковый элемент из списка строк c # linq - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь получить список пользователей после фильтрации по их имени.

Запрос:

string filter="alex, faheem, Cohen";
var filterArr=filter.Split(new []{','},StringSplitOptions.RemoveEmptyEntries).Select(f=>f.Trim()).ToList();

var users= (from u in DbContext.Users
                where filterArr.Any(y=> u.Name.Contains(y)) select u);

Это дает мне ошибку:

Локальная последовательность не может использоваться в реализациях операторов запросов LINQ to SQL, кроме оператора Contains.

Я не могу использовать filterArr.Contains(x.Name), поскольку столбец Имя содержит как имя, так и второе имя. Как и в приведенном выше списке, это элемент «alex», и у меня есть имя «Alex Hales», объединенное в столбце «Имя». Поэтому, если я использую filterArr.Contains(x.Name), это не даст мне результата.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Я не уверен, что это возможно в одном утверждении, подобном этому. Это слишком сложно для плохого разбора.

Однако вы можете получить IQueryable (), затем выполнить итерации по вашим фильтрам, добавить их в качестве отдельных предложений WHERE, после чего они должны быть правильно добавлены в SQL позже.

Примерно так:

//this just gets a reference the DbSet, which implements IQueryable<User>
var queryable = _dbContext.Users;

//iterate over the filters and add each as a separate WHERE clause
foreach(var f in filters)
{
    //this just adds to the existing expression tree..
    queryable = queryable.Where(u=>u.Name.Contains(f));
}
//this will actually hit the database.
var results = queryable.ToList();

Это должно сгенерировать что-то вроде это в SQL (полностью псевдокод)

select 
  u.*
from 
  users u
where 
  (u.username like "%Sue%")
  or (u.username like "%Bob%")

Надеюсь, это поможет ...

0 голосов
/ 29 апреля 2019

Я думаю, вы можете сделать что-то вроде этого

string filter = "alex, faheem, Cohen";
var filterArr = filter.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim()).ToList();
var users = _dbContext.Users.Where(x => filterArr.Any(n => n.Contains(x.Name))).ToList();

UPDATE По вашему требованию следующий запрос будет работать нормально.

string filter = "Alex, faheem, Cohen";
var filterArr = filter.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim())
            .ToList();
var users = _dbContext.Users
            .Where(x => filterArr.Any(n => x.UserName.Contains(n))).ToList();

Если пользователь выполнил поиск "alex" и в поле "Имя" (столбец базы данных) есть "Alex Hales". users запрос вернет пользователя "Алекс Хейлз".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...