17

我有一个 LINQ 项目,我想在其中使用我自己的方法。此 NoWhiteSpaces 方法应返回不带空格的大字符串。

public static class LittleExtensions
{
    public static string NoWhiteSpaces(this String s)
    {
        return Regex.Replace(s, @"\s", string.Empty).ToUpper();
    }
}

当我想将此方法与 LINQ 一起使用时,如下所示:

static void GetHaendler()
    {
        using (var riaService = new gkmRia())
        {
            var hladany = "someone";
            var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet()
                            where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces()
                            select hndlr;
            Console.Write(haendlers.First().NameOutlet);
        }
    }

我收到此错误消息:

LINQ to Entities 无法识别方法 'System.String NoWhiteSpaces(System.String)' 方法,并且此方法无法转换为存储表达式。

有什么解决办法吗?感谢您的时间。

4

2 回答 2

15

无法对 LINQ to Entities 使用自定义方法或属性,因为 LINQ to Entities 需要能够将表​​达式转换为 SQL 语句,而您的方法无法做到这一点。

一种解决方法是绕过 LINQ to Entities,而是使用 LINQ to Objects 来Enumerable代替Queryable(注意AsEnumerable()下面的代码):

static void GetHaendler()
{
    using (var riaService = new gkmRia())
    {
        var hladany = "someone";
        var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet().AsEnumerable()
                        where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces()
                        select hndlr;
        Console.Write(haendlers.First().NameOutlet);
    }
}

请注意,这会导致查询在您的应用程序中而不是在数据库中执行,因此可能会对性能产生一些影响。如果可能,最好更改查询,以便可以使用Entity Framework 支持的方法来表达它。

LINQ to Entities 支持的替代表达式如下:

var hladany = "someone".NoWhiteSpaces();
var haenflers = from hndlr in riaService.GetGkmHaendlerOutlet().
                where hndlr.NameOutlet.Replace(" ", "").Replace("\t", "") == hladany
                select hndlr;

此示例仅处理空格和制表符(正则表达式也处理不同的空白字符),但我不知道您的确切要求,所以这可能就足够了。你总是可以链接更多的Replace调用来做额外的替换。

于 2013-06-19T09:24:12.647 回答
6

LINQ to Entities 尝试将每个调用的方法转换为执行的数据库查询的一部分。当试图翻译你的方法时,它失败了,因为它不知道如何在 SQL 中表示它。

你可以绕过它

  • 在具体化结果后执行查询并过滤它(如果您正在处理大型数据集,这是个坏主意),或者
  • 仅使用受支持的方法(更好的方法 IMO)。您可以在此处找到支持的方法列表:
    CLR 方法到规范函数映射
    由于方法String.Replace()String.ToUpper()受支持,用它替换您的自定义方法应该很容易。
于 2013-06-19T09:25:05.510 回答