我有一个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;
}
答案 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
创建UDF。使用LTRIM,RTRIM,LOWER,REPLACE功能。这样的事情。
创建函数dbo.ToUrlString(@string VARCHAR(MAX)) 退货VARCHAR(MAX) 开始 RETURN REPLACE(REPLACE(LOWER(LTRIM(RTRIM(@string))),'',' - '),':','') END
将其作为方法添加到DataContext中。只需将它从服务器资源管理器拖放到L2S设计器上即可。
我希望它有所帮助。