Я храню List<string>
в базе данных SQL как значения, разделенные запятыми, используя функцию HasConversion
EF Core. Я ценю простоту этого, но сейчас я пытаюсь запросить это свойство. Сейчас я работаю над этим путем фильтрации после извлечения записей из БД, но я бы предпочел улучшить запрос. Как я могу написать свой запрос LINQ так, чтобы EF Core мог перевести его в оператор SQL?
Свойство:
public List<string> AccountTypes { get; set; }
Конфигурация в контексте БД:
modelBuilder.Entity<Account>().Property(c => c.AccountTypes).HasConversion(
t => string.Join(',', t),
t => t.Split(',', StringSplitOptions.RemoveEmptyEntries));
Пример запроса, который не удалось преобразовать в SQL:
IQueryable<Account> query = context.Accounts.Where(a => a.AccountTypes.Any(t => t == "A")).AsQueryable();
Сообщение об ошибке:
Не удалось преобразовать выражение LINQ. Либо переписать запрос в форме, которую можно перевести, либо явно переключиться на оценку клиента, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c ().
Я прочитал статью Microsoft , касающуюся оценки «Клиент против сервера», но я не верю, что использование оценки на стороне Клиента имеет какое-либо преимущество по сравнению с моим текущим обходным решением - просто фильтровать результаты после возвращения запроса к базе данных. Я ожидаю, что вставка любого из предложенных вызовов просто выполнит SQL в этот момент, вернет большое подмножество и только затем применит фильтр к AccountTypes
.