public ActionResult Index(string title)
{
var post = (from p in dataContext.Posts
where RemoveChar(p.Title) == title && !p.Deleted
select p).Single();
post.Visit = post.Visit + 1;
dataContext.SubmitChanges();
return View(new ViewData.PostIndexViewData(post));
}
public string RemoveChar(string Item)
{
var s = from ch in Item
where !Char.IsPunctuation(ch)
select ch;
var bytes = UnicodeEncoding.ASCII.GetBytes(s.ToArray());
var stringResult = UnicodeEncoding.ASCII.GetString(bytes);
return stringResult;
}
这是否可行,因为我得到方法'System.String RemoveChar(System.String)'没有支持的SQL转换。
答案 0 :(得分:1)
不,你不能在LINQ to SQL中使用自己的自定义方法 - 它不知道如何将它们转换为SQL。 (表达式树只包含对RemoveChar
的调用 - 它不构建表达式树来表示RemoveChar
中的代码。)我不确定是否有一种特别好的方法可以做到这一点 - 您可以编写用户定义的函数或存储过程,并在LINQ中正确映射。 (哎呀,如果你使用的是SQL Server并且有自愿的DBA,你可以使用CLR用户定义的函数。)
我想补充一点,你的RemoveChar实现在某些方面远非理想 - 我建议使用Regex.Replace
来代替进程中的标点符号删除。
答案 1 :(得分:0)
问题在于您将本地函数混合到Linq表达式中,Linq to SQL希望将其转换为SQL以发送到服务器。
要解决此问题,您需要加载整个帖子列表并在内存中查询结果,这可能不太理想。
我认为您需要对应用程序进行更改 - 您应该能够使用不需要修改数据库中的数据以匹配的密钥来搜索数据库。
我建议您添加一个“SearchTitle”列,这个标题是根据您的示例删除的标点符号,然后您的查询变得微不足道(并且效率更高),代价是数据库中的少量额外空间