как объединить строку в AsQueryable для поиска по имени, проверив значение null

#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. тем не менее, там говорится, что это невозможно перевести