@Pavel_Develop

Как грамотно и лаконично реализовать метод like sql в IQueryable Linq?

Есть пользовательский интерфейс, содержащий два поля ввода(Откуда, Куда), в которые пользователь вводит маску телефона, при этом возможны варианты: 91*(находит все номера начинающиеся на 91), *91(заканчивающиеся на 91) или 1234(заканчивающиеся на 1234). По сути два последних исхода одинаковы.

Так как дело происходит со строками решил реализовать класс с методом расширения для строки:
public static class StringExtenstions
    {
        public static bool Like(this string str, string value, string[] seps)
        {

            if (String.IsNullOrWhiteSpace(value))
                return true;

            value = value.Trim();
            var position = -1;

            foreach (var sep in seps)
            {
                if (!value.Contains(sep))
                    continue;

                position = value.IndexOf(sep, StringComparison.Ordinal);
                value = value.Replace(sep, String.Empty);
                break;
            }

            return position > 0 ? str.StartsWith(value) : str.EndsWith(value);
        }
    }


И пробую запустить сие творение при выборке телефонов из бд:
var seps = new[] { "%", "*" };
calls = calls.Where(x => x.Source.Like(filter.From, seps) || x.Transfers.Any(t => t.SubjectFrom.Like(filter.From, seps)));


К моему сожалению происходит ошибка:
Выражению LINQ to Entities не удается распознать метод "Boolean Like(System.String, System.String, System.String[])", поэтому его нельзя преобразовать в выражение хранилища.

Есть какие-нибудь идеи как правильно решить данную проблему с помощью linq, не городя при этом кучу условий(if) и без написания запросов sql в коде(select * from calls where Source like '91%')?
  • Вопрос задан
  • 3123 просмотра
Пригласить эксперта
Ответы на вопрос 1
Добрый день.
Если на пальцах объяснять, то Linq to Entities просто генерирует sql-ный код, который позже выполняется на стороне базы соответственно в выражении нельзя использовать операции, которые нельзя произвести на стоне сервера(как в Вашем случаи вызов функции).

По-моему самым простым(наверное и самым быстрым) решением будет написать функцию на стороне базы и вызвать ей в коде приложения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы