2012-04-15 2 views
1

Это мой LINQ запрос (Linq к Sql):Почему я не могу вызвать функцию внутри запроса linq?

pagina = (from Pagine page in kDataBase.Pagines 
      where prova(page.title_it) == urlSuddivisa[i].ToLower() 
      select page).FirstOrDefault(); 

и это функция, которую я называю (внутри одного класса):

private string prova(string example) 
{ 
    return example; 
}    

он говорит:

для метода 'System.String prova (System.String) не поддерживается преобразование в sql.

Где я ошибаюсь? И как я могу это исправить?

ответ

3

Поскольку запрос linq преобразуется в SQL-запрос, который работает против вашего дБ, он не может перевести вашу пользовательскую функцию в SQL-запрос.

Альтернативные способы appraoaching неполадку

  • Используйте хранимую процедуру и прочитать об использовании хранимой процедуры в LINQ
  • получить данные из SQL в памяти, а затем фильтровать его на основе вашей функции. Недостаток, очевидно, здесь вы будете извлечения много много количества строк из базы данных, чем требуется

    var paginas=(from Pagine page in kDataBase.Pagines).ToList().Where(p =>prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault();

    является то, что вы хотите.

На стороне записки я угадываю ваш метод prova делает больше, чем просто возвращая строку в противном случае функция откровенная бесполезно, и вы можете также избавиться от этой функции. Также я считаю, что вы запускаете несколько запросов к базе данных cos массива, который вы используете с помощью счетчика i, вы всегда можете использовать запрос IN и обойти его, помните ограничение количества элементов в запросе IN.

1

linq to sqlExpression tree получить синтаксический анализ SQL-запроса, а не просто запустить его, как и с linq to objects.

Ваш провайдер ORM не знает, как hot преобразовать метод в SQL.

Вы не должны использовать методы в linq to SQLLINQ запросов.

3

Ваше выражение запроса linq транслируется в sql во время выполнения, а среда не знает, как преобразовать вызов метода prova в соответствующий sql. Вместо этого, вы можете сделать что-то вроде этого:

pagina = (from Pagine page in kDataBase.Pagines select page).ToList().Where(p => prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault(); 

Это будет тянуть страницы в память первого через ToList, где метод Prova может быть оценен.

Смежные вопросы