Как запросить, когда поле не начинается с буквы? - PullRequest
1 голос
/ 09 декабря 2010

Мне поручено добавить опцию в наш поиск, которая будет возвращать результаты, если данное поле не начинается с буквы алфавита.(Часть .StartsWith (буква) не была такой сложной).

Но я не совсем уверен, как получить результаты, которые не попадают в набор AZ, ив равной степени надеясь, что он генерирует какой-то умеренно эффективный SQL-код.

Любая помощь приветствуется - спасибо.

Ответы [ 3 ]

3 голосов
/ 09 декабря 2010

В C # используйте следующую конструкцию, принимая db в качестве контекста данных:

var query = from row in db.SomeTable
            where !System.Data.Linq.SqlClient.SqlMethods.Like(row.SomeField, "[A-Z]%")
            select row;

Это поддерживается только в запросах LINQ to SQL. Применяются все правила оператора T-SQL LIKE.

Вы также можете использовать менее эффективное решение:

var query = from row in db.SomeTable
            where row.SomeField[0] < 'A' || row.SomeField[0] > 'Z'
            select row;

Это преобразуется в конструкции SUBSTRING, CAST и UNICODE.

Наконец, вы можете использовать VB, где, как представляется, имеется встроенная поддержка метода Like.

1 голос
/ 09 декабря 2010

Хотя SQL предоставляет возможность проверять диапазон символов в операторе LIKE, используя скобочные обозначения (например, [a-f]%), я не видел конструкции linq to sql, которая поддерживает это напрямую.

Пара мыслей:

Во-первых, если набор результатов относительно мал, вы можете сделать .ToList() и отфильтровать память по факту.

В качестве альтернативы, еслиу вас есть возможность изменить модель данных, вы можете настроить дополнительные поля или таблицы, чтобы помочь индексировать данные и улучшить поиск.

- EDIT--

Внесены изменения в соответствии с комментарием Руслана ниже.

0 голосов
/ 09 декабря 2010

Ну, я понятия не имею, сработает ли это, потому что я никогда не пробовал и у меня нет компилятора поблизости, но первое, что я бы попробовал, это

var query = from x in db.SomeTable
            where x.SomeField != null &&
                  x.SomeField.Length >= 1 &&
                  x.SomeField.Substring(0, 1).All(c => !Char.IsLetter(c))
            select x;

Существует вероятность того, что LINQ to SQL не сможет преобразовать это в SQL.

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