Страница поиска ASP.NET MVC - целое число начинается с Linq + EF4 - PullRequest
1 голос
/ 27 марта 2011

Итак, в моем последнем посте я спрашивал, как создать динамический поисковый фильтр с использованием LINQ и EF4 ( см. Здесь ), и, наконец, нашел решение построить выражение в виде строки и проанализировать его. в выражение с использованием библиотеки Dynamic LINQ.

Я решил проблему. Я смог сгенерировать Expression<Func<TSource, out bool>> и передать его Where() методу DbSet. Я также пытаюсь сделать это, используя MySql в качестве базы данных за EF4.

Проблема возникла, когда я попытался применить строковые операции к целым числам, например, поиск записи в базе данных, последовательный номер которой начинается с 1234.

Мое первоначальное выражение было что-то вроде: record.ConsecutiveNumber.ToString().StartsWith("1234"). К сожалению, как и ожидалось, все оказалось не так просто, так как EF4 не может запросить DbSet за исключением:

"LINQ to Entities не распознает метод 'System.String ToString ()' метод, и этот метод не может быть переведено в магазинное выражение. "

После некоторого поиска в Google я обнаружил, что это распространенная проблема. Но давай! Есть ли способ выполнить функцию поиска, которая может искать записи с последовательным номером, начинающимся с «1234»?

Как профессионалы реализуют функции поиска с EF4? Это с одним фильтром свойств. Что если я хочу добавить несколько фильтров? Боже, у меня болит голова ...: /

Спасибо!

EDIT:

Мысль № 1: А как насчет хранимой процедуры? Как насчет вызова хранимой процедуры MySql из Linq? Я стремлюсь слишком высоко?

Ответы [ 5 ]

4 голосов
/ 27 марта 2011

Вы можете использовать метод SqlFunctions.StringConvert .Требуется double (или decimal), поэтому вам придется разыграть ваш int ConsecutiveNumber.

Заменить:

record.ConsecutiveNumber.ToString().StartsWith("1234")

С:

SqlFunctions.StringConvert((double)record.ConsecutiveNumber).StartsWith("1234")
0 голосов
/ 02 апреля 2011
Any method calls in a LINQ to Entities query that are not explicitly mapped to a canonical function will result in a runtime NotSupportedException exception being thrown. 

Проверьте отображение канонической функции здесь: http://msdn.microsoft.com/en-us/library/bb738681.aspx

В этом случае вы можете использовать математическую функцию. (Я не думаю, что код сначала может быть использован в проекте продукта в то время)

0 голосов
/ 01 апреля 2011

Я не имею понятия, будет ли это работать над Linq для EF или нет, но при условии, что они отобразили математические операции, это может решить вашу потребность:

record.ConsecutiveNumber / Math.Pow(10, Math.Truncate(Math.Log10(record.ConsecutiveNumber) - 3)) == 1234

Это в основном деление числана 10, достаточно большой, чтобы оставить первые 4 цифры.

Я знаю, что это очень хакерски и неэффективно, даже если это работает, но вы идете.:)

0 голосов
/ 30 марта 2011

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

Согласно другим сообщениям SqlFunctions.StringConvert ((double) record.ConsecutiveNumber) работает для Sql Server.

Проблема с преобразованием int в строку в Linq в сущности

А вот соответствующая информация о преобразованиях linq.

Linq int в строку

А вот ответ, намекающий на написание собственной функции sql для stringconvert

Использование функции SQL в Entity Framework Выберите

ЕслиSqlFunctions.StringConvert не работает для вас, я бы посоветовал посмотреть, как это сделать в Sql, а затем написать собственный [EdmFunction()] атрибутный метод .

0 голосов
/ 30 марта 2011

Посмотрели ли вы Dynamic LinQ Library: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

А на твой вопрос Как использовать «содержит» или «как» в динамическом запросе linq?

Ранее я получил код для этой библиотеки и просто заглянул внутрь, за ним довольно легко следить.

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