如何调整简单的String扩展以支持SQL

时间:2010-06-22 04:41:01

标签: c# asp.net-mvc-2 extension-methods

我有一个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;
}

2 个答案:

答案 0 :(得分:1)

不,你不能将它转换为SQL,至少在没有实现自己的LINQ TO SQL提供程序的情况下。

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

LINQ使用IQueryable将表达式的转换作业转换为SQL语言。在使用IQueryable时(从datacontext实现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();
}

希望它有所帮助!

答案 1 :(得分:1)

我认为你可以创建UDF来在数据库级别上执行必需的字符串操作。 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. 创建UDF。使用LTRIM,RTRIM,LOWER,REPLACE功能。这样的事情。

    创建函数dbo.ToUrlString(@string VARCHAR(MAX)) 退货VARCHAR(MAX) 开始 RETURN REPLACE(REPLACE(LOWER(LTRIM(RTRIM(@string))),'',' - '),':','') END

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

  3. 我希望它有所帮助。