使用我自己的LINQ to Entities方法

我有一个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)’方法,并且此方法无法转换为商店表达式。

有解决方案吗 感谢您的时间。

由于LINQ to Entities需要能够将表​​达式转换为不能用您的方法执行的SQL语句,因此无法使用LINQ to Entities的自定义方法或属性。

一种方法是绕过LINQ to Entities,而是使用Enumerable而不是Queryable来使用LINQ to Objects(注意下面代码中的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呼叫以执行其他替换。

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

你可以通过它们绕过它

  • 实现结果执行查询并对其进行过滤(如果您正在处理大型数据集,则不好主意),或者
  • 仅使用支持的方法(更好地接近IMO)。 您可以在此处找到支持的方法列表:
    规范函数映射的CLR方法
    由于支持String.Replace()String.ToUpper()方法,因此应该很容易用它替换自定义方法。