使用我自己的LINQ to Entities方法

时间:2013-06-19 09:14:48

标签: c# linq entity-framework

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

任何解决方案?谢谢你的时间。

2 个答案:

答案 0 :(得分:15)

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

一种方法是绕过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);
    }
}

请注意,这会导致查询在您的应用程序中而不是在数据库中执行,因此可能会有一些性能影响。如果可能,最好更改查询,以便可以使用methods supported by the 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次来进行额外替换。

答案 1 :(得分:6)

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

你可以通过

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