Извините, я не могу предоставить реальный код по разным причинам.
Но я пытаюсь создать функцию поиска для нескольких записей в классе
пример
У меня есть реализованная задача
public async Task<List<RequestList>> SearchRequestAsync(string searchItem)
{
return await context.RequestLists.Where(s => s.RequestName.ToString().Contains(searchItem)).ToListAsync();
}
RequestName — одно из значений в моей базе данных.
Это работает для этого столбца, но я хочу фильтровать по нескольким столбцам.
Что касается контекста, я очень новичок в этом и строю и учусь по ходу дела.
По сути, я пытался посмотреть, смогу ли я добавить значения из списка RequestList в другой частный список, но не смог понять, как это сделать.
@Peppermintology Из-за моих новичковых знаний я изо всех сил пытался понять, насколько связанная тема соответствует моим требованиям. Мне было легче понять и применить ответы, данные здесь.
Вы можете составлять запросы в Linq. Я думаю, что вы хотите что-то вроде:
public async Task<List<RequestList>> SearchRequestAsync(string? searchItem1, string? searchItem2 )
{
var query = context.RequestLists;
if (searchItem1 is not null)
{
query = query.Where(s => s.RequestName.ToString().Contains(searchItem1));
}
if (searchItem2 is not null)
{
query = query.Where(s => /* some other condition */ );
}
return await query.ToListAsync();
}
несколько предложений Where() работают последовательно, поэтому они объединяются с помощью оператора AND.
Это работает. Спасибо. Мне пришлось изменить «is not null» на «!- «»». Поскольку он не перезагружал записи, в которых не было введено значение для одного из моих полей. Было бы здорово, если бы функцияwhere() работала как ИЛИ, а не И. Но я могу справиться с этой задачей. :)
Чтобы обрабатывать поиск без учета регистра, если параметры сортировки вашей базы данных не учитывают регистр, я предлагаю создать версию в нижнем регистре для каждого столбца, в котором вы хотите выполнить поиск. Например, если у вас есть столбец с именем RequestName, создайте еще один столбец, например RequestNameLowercase. Сделайте то же самое для других свойств, которые вы хотите сделать доступными для поиска.
Тогда запрос будет выглядеть так:
public async Task<List<RequestList>> SearchRequestAsync(string searchItem)
{
var query = context.RequestLists
.AsNoTracking(); // since you will retrieve results, EF tracking not needed ( this will increase the performance )
if (!string.IsNullOrWhitespace(searchItem))
{
var searchItemLowercase = searchItem.ToLowerInvariant();
// 'Like' function might be heavy but definitely will give more results, but you may use Contains as well.
var searchItemLowercasePattern = $"%{searchItemLowercase}%";
query = query
.Where(s => EF.Functions.Like(s.RequestNameLowercase, searchItemLowercasePattern))
.Where(s => EF.Functions.Like(s.MyAnotherFieldLowercase, searchItemLowercasePattern))
.Where(s => s.MySecondFieldLowercase.Contains(searchItemLowercase));
}
return await query.ToListAsync();
}
надеюсь, это поможет,
Почему лайк? Плохо то, что вы не избежали символов шаблона поиска.
Этот вопрос похож на: Как сделать поиск по всем полям в ASP.Net Api. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.