Как мне сказать linq2db, как перевести данное выражение, то есть Split (char) в SQL, когда он не знает, как это сделать?
я используюlinq2db
и хотя он работает достаточно хорошо для большинства операций CRUD, я встречал много выражений, которые он просто не может перевести на SQL.
Дошло до того, что, если я заранее не знаю точно, какие выражения будут задействованы, и успешно вызывал их раньше, я боюсь, что любая выгода будет получена отlinq2db
будет перевешивать стоимость попыток найти и затем удалить (или удалить со стороны сервера) оскорбительные выражения.
Если бы я знал, как сказатьlinq2db
как разобратьExpression<Func<T,out T>>
или что-то еще в SQL всякий раз, когда это происходит на временной основе, тогда я был бы намного увереннее, и я мог бы сделать много вещей, используя этот инструмент.
Взять, к примеру,String.Split(char separator)
, метод, который принимаетstring
иchar
вернутьstring[]
каждой подстроки между разделителем.
Предположим мой столEquipment
имеет обнуляемыйvarchar
полеUsages
который содержит списки различного использования оборудования, разделенные запятыми.
Мне нужно реализоватьIList<string> GetUsages(string tenantCode, string needle = null)
это даст список использования для данного кода клиента и необязательную строку поиска.
Мой запрос будет выглядеть примерно так:
var listOfListOfStringUsages =
from et in MyConnection.GetTable<EquipmentTenant>()
join e in MyConnection.GetTable<Equipment>() on et.EquipmentId = e.EquipmentId
where (et.TenantCode == tenantCode)
where (e.Usages != null)
select e.Usages.Split(','); // cannot convert to sql here
var flattenedListOfStringUsages =
listOfListOfStringUsages.SelectMany(strsToAdd => strsToAdd)
.Select(str => str.Trim())
.Distinct();
var list = flattenedListOfStringUsages.ToList();
Тем не менее, он на самом деле будет бомбить во время выполнения на линии, указанной в комментарии.
Я полностью понимаю, чтоlinq2db
Нельзя ожидать, что создатели отправят с каждой комбинациейstring
метод и основной пакет базы данных.
В то же время я чувствую, что мог бы полностью объяснить, как с этим справиться, если бы я мог просто увидеть пример того, как это сделать (кто-то, реализующий пользовательское выражение).
Итак, мой вопрос:как я должен проинструктироватьlinq2db
о том, как разобратьExpression
что не может разобрать из коробки?