#c# #linq
Вопрос:
Я хочу выполнить поиск по a name
, который является вводом из пользовательского интерфейса, однако у меня есть отдельные поля для имени в базе данных, которые являются именем, фамилией и средним инициалом.
До сих пор то, что я пробовал:
var filtered = (from c in _dbContext.Address
join i in _dbContext.Customers.Where(a => !request.AccountNumbers.Any() ||
request.AccountNumbers.Contains(a.AccountNum)) on c.FkParent equals i.Id
select new ContactRequestListModel
{
Id = c.ID,
FirstName = c.FirstName,
LastName = c.LastName,
MiddleInitial = c.MiddleInitial
});
var query = filtered.AsQueryable();
if (request.Names.Any())
query = query.Where(x => request.Names.Contains(x.FullName));
Contactlistrequestмодель
public class ContactRequestListModel : ContactRequestModel
{
public int Id { get; set; }
public string FullName => string.Join(" ", new string[] { FirstName, MiddleInitial, LastName }.Where(s => !string.IsNullOrEmpty(s)));
}
Средний инициал может быть равен нулю, что может привести к добавлению двойных пробелов при объединении строки, поэтому я попытался опустить пробелы в name
. Но этот запрос выдал мне ошибку.
Выражение LINQ … не удалось перевести. Либо перепишите запрос в форме, которую можно перевести, либо явно переключитесь на оценку клиента, вставив вызов «AsEnumerable», «AsAsyncEnumerable», «ToList» или «ToListAsync».
Я не хотел преобразовывать запрос в ToList() и фильтровать по имени.
Но есть ли какой-либо способ выполнить запрос, проверив значение null MiddleInitial
и запросив как AsQueryable
. Каков обходной путь в этом случае?
Комментарии:
1. Потому что ваша логика полного имени не может быть переведена на SQL. Сначала вам нужно загрузить результаты в память. Затем вы можете запустить свое выражение. запрос var = отфильтрован. ToList(); Но если записей много, у вас могут возникнуть проблемы с памятью.
2. как поступить с
IQueryable
этим, не меняя его на ToList()?3. запрос var = отфильтрован. ТоЛист(). ЗаВещаемый();
4. в чем преимущество повторного преобразования tolist в queryable? есть ли какие-то преимущества?
5. Что — то не так с вашим образцом кода-ваша ссылка
x.FullName
, но не определенаFullName
в вашем запросе. Вам действительно следует переписать, чтобы сделать » где » перед выбором.
Ответ №1:
Вы пытались использовать оператор :
public string FullName {
get {
return FirstName MiddleInitial ?? "" LastName ;
}
}
Комментарии:
1. тем не менее, там говорится, что это невозможно перевести