为什么我不能在linq查询中调用函数?

时间:2012-04-15 11:56:49

标签: c# .net linq linq-to-sql

这是我的linq查询(Linq to Sql):

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 个答案:

答案 0 :(得分:3)

由于linq查询转换为针对您的dB运行的SQL查询,因此无法将自定义函数转换为SQL查询。

解决问题的其他方法

  • 使用存储过程并阅读有关在linq
  • 中使用存储过程的信息
  • 将数据从SQL检索到内存,然后根据您的函数对其进行过滤。显而易见的缺点是,您将从数据库中检索许多行而不是所需的行

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

    是你想要的。

在旁注上我猜你的方法prova不仅仅是返回字符串,否则函数完全没用,你也可以摆脱这个函数。此外,我相信您正在使用计数器i对数组的数据库cos发出多个查询,您可以始终使用IN查询并绕过它,记住数量的限制IN查询中的元素。

答案 1 :(得分: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方法。

答案 2 :(得分:1)

使用linq to sql Expression tree解析为SQL查询,而不是像linq to objects一样运行它。

您的ORM提供程序不知道将方法转换为SQL。

您不应在linq to SQL LINQ次查询中使用方法。