【问题标题】:Why I can't call a function inside a linq query?为什么我不能在 linq 查询中调用函数?
【发布时间】:2012-04-15 11:56:48
【问题描述】:

这是我的 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。

我哪里错了?我该如何解决?

【问题讨论】:

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


    【解决方案1】:

    您的 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 方法。

    【讨论】:

    • 我自己刚遇到这个问题,我想我希望 Linq 在编译时尝试将您的方法转换为可以在数据库上执行的方法。它将消除大量重复的代码。因为我最终所做的是将代码复制并粘贴到我试图调用 Where 语句的方法中。我打赌有一天这种功能会可用。
    【解决方案2】:

    由于 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 向您正在使用的数组的数据库发起多个查询,您始终可以使用IN 查询并绕过它,记住@ 中元素数量的限制987654325@查询。

    【讨论】:

      【解决方案3】:

      使用linq to sqlExpression tree 被解析为 SQL 查询,而不是像使用 linq to objects 那样运行它。

      您的 ORM 提供者不知道如何将方法转换为 SQL。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-23
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        相关资源
        最近更新 更多