首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对LINQ to Entities使用我自己的方法

对LINQ to Entities使用我自己的方法
EN

Stack Overflow用户
提问于 2013-06-19 17:14:48
回答 2查看 7.9K关注 0票数 17

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

代码语言:javascript
复制
public static class LittleExtensions
{
    public static string NoWhiteSpaces(this String s)
    {
        return Regex.Replace(s, @"\s", string.Empty).ToUpper();
    }
}

当我想在LINQ中使用这个方法时,就像这样:

代码语言:javascript
复制
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)“”方法,并且此方法无法转换为存储表达式。“”

有什么解决方案吗?谢谢您抽时间见我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-19 17:24:13

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

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

代码语言:javascript
复制
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支持的另一个表达式可能如下所示:

代码语言:javascript
复制
var hladany = "someone".NoWhiteSpaces();
var haenflers = from hndlr in riaService.GetGkmHaendlerOutlet().
                where hndlr.NameOutlet.Replace(" ", "").Replace("\t", "") == hladany
                select hndlr;

这个示例只处理空格和制表符( regex还处理不同的空格字符),但我不知道您的确切要求,所以这可能就足够了。你可以随时链接更多的Replace调用来做额外的替换。

票数 15
EN

Stack Overflow用户

发布于 2013-06-19 17:25:06

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

你可以通过以下两种方式来绕过它:

  • 执行查询,并在具体化结果后对其进行过滤(如果您正在处理大型数据集,这不是一个好主意),或者
  • 只使用支持的方法(更好的方法是IMO)。您可以在此处找到支持的方法列表:

CLR Method to Canonical Function Mapping

由于支持String.Replace()String.ToUpper()方法,因此用它替换您的自定义方法应该很容易。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17187395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档