Хранить массив как запятую, как сделать запрос с LINQ? - PullRequest
0 голосов
/ 24 апреля 2020

Я храню 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.

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