如何调整简单的字符串扩展来支持 SQL

发布于 2024-09-06 16:38:07 字数 1027 浏览 5 评论 0原文

我有一个 C# 字符串扩展,确实让生活变得轻松,但我遇到了例外:

Method 'System.String ToUrlString(System.String)' has no supported translation to SQL.

我认为这是一个常见问题,有些人已经找到了解决此问题的方法,但我不确定它是否有效对我来说是可能的。这只是一个简单的捷径,我也尝试将它与正则表达式一起使用,并且出现了相同的异常。

public static string ToUrlString(this String val)
{
    return val.Trim().ToLower().Replace(" ", "-").Replace(":", string.Empty);
}

是否有任何其他装饰器或方法可以调整此代码以使其支持 SQL?我在 LINQ 表达式中的 where 子句上调用它。 .ToTagString().ToUrlString() 方法并不完全相同,但非常相似。

编辑:根据下面的建议,这是我尝试过的其他方法,但我仍然遇到相同的错误。

public IEnumerable<Post> GetPostsByTag(string tagName)
{
    var query = from p in db.Posts
           join pt in db.PostTags on p.PostID equals pt.PostID
           where pt.Tag.TagName.ToTagString().Equals( tagName.ToTagString() )
           orderby p.PostDate descending
           select p;

    var result = query.AsEnumerable();

    return from r in result
           select r;
}

I've got a C# string extension that really makes life easy, but I am getting the exception:

Method 'System.String ToUrlString(System.String)' has no supported translation to SQL.

I've seen this as a common problem and some people have found ways around fixing this for their method, but I'm not sure it's possible for mine. It's just a simple short cut and I've tried using it with a Regular Expression as well, and the same exception comes up.

public static string ToUrlString(this String val)
{
    return val.Trim().ToLower().Replace(" ", "-").Replace(":", string.Empty);
}

Are there any additional decorators or ways I can adapt this code so that it can support SQL? I'm calling this on the where clause in my LINQ expressions. .ToTagString() is not the exact same method as .ToUrlString() but it's very similar.

EDIT: Per a suggestion below, here is something else I tried, but I am still getting the same error.

public IEnumerable<Post> GetPostsByTag(string tagName)
{
    var query = from p in db.Posts
           join pt in db.PostTags on p.PostID equals pt.PostID
           where pt.Tag.TagName.ToTagString().Equals( tagName.ToTagString() )
           orderby p.PostDate descending
           select p;

    var result = query.AsEnumerable();

    return from r in result
           select r;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

萌酱 2024-09-13 16:38:07

不,您无法将其转换为 SQL,至少在不实现您自己的 LINQ TO SQL 提供程序的情况下是这样。

问题是您在 Linq 查询中使用它,因此它尝试将您的方法转换为 SQL 语言。

LINQ 使用 IQueryable 将表达式转换为 SQL 语言。当您使用 IQueryable(从数据上下文返回的所有实体都实现 IQueryable)时,应用于它的所有方法都将转换为 SQL。

为了避免您的自定义方法被转换为 SQL,您应该首先将 LINQ 表达式转换为 IEnumerable,这样就不会发生进一步的转换:

public IEnumerable<String> Example()
{
     var query = from f in foos
            where f.Id == 'myId'
            select f;

     var result = query.AsEnumerable();

     return from r in result
            select r.Url.ToUrlString();
}

希望它有帮助!

No you cannot translate that to SQL, at least without implementing your own LINQ TO SQL provider.

The problem is that you are using it inside a Linq query, so it tries to translate your method to SQL language.

LINQ uses IQueryable to do the tranlation job of your expression to SQL language. While you are using IQueryable (all entities returned from the datacontext implement IQueryable), all the methods applied to it will be translated to SQL.

To avoid your custom method being translated to SQL, you should first convert your LINQ expression to IEnumerable, so no further tranlation will occur:

public IEnumerable<String> Example()
{
     var query = from f in foos
            where f.Id == 'myId'
            select f;

     var result = query.AsEnumerable();

     return from r in result
            select r.Url.ToUrlString();
}

Hope it helps!

时光磨忆 2024-09-13 16:38:07

我认为您可以创建 UDF 在数据库级别执行所需的字符串操作。 http://msdn.microsoft.com/en-us/library/bb386973。 ASPX
http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retriving-data-using-stored-procedures.aspx

  1. < p>创建UDF。使用 LTRIM、RTRIM、LOWER、REPLACE 函数。像这样的东西。

    创建函数 dbo.ToUrlString(@string VARCHAR(MAX))
    返回 VARCHAR(MAX)
    开始
    返回替换(替换(下(LTRIM(RTRIM(@string))),'','-'),':','')
    结束

  2. 将其作为方法添加到 DataContext 中。只需将其从服务器资源管理器拖放到 L2S 设计器中即可。

我希望它有帮助。

I think you can create UDF to perform required strings manipulation on DB level. http://msdn.microsoft.com/en-us/library/bb386973.aspx
http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx

  1. Create UDF. Use LTRIM, RTRIM, LOWER, REPLACE functions. Something like this.

    CREATE FUNCTION dbo.ToUrlString(@string VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    BEGIN
    RETURN REPLACE(REPLACE(LOWER(LTRIM(RTRIM(@string))), ' ','-'), ':', '')
    END

  2. Add it as a method to your DataContext. Just drag'n'drop it from Server Explorer onto L2S designer.

I hope it helps.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文