我想运行这样的LINQ查询:
var words = from p in db.Words
where p.Document.Corpus.Name == corpus
//where LevenshteinDistance(p.Text.ToCharArray(), word.ToCharArray()) < threshold
select p;
但如果我将“LevenshteinDistance”函数放在那里会产生错误:
NotSupportedException:方法'Char [] ToCharArray()'没有支持的SQL转换。
有没有正确的方法呢?
答案 0 :(得分:6)
LINQ to SQL尝试将整个表达式转换为SQL。如果要在SQL Server上运行距离函数,则需要定义SQL Server UDF并将自定义CLR方法映射到该方法。如果您满足于获取所有结果,然后在距离函数上过滤客户端,请使用AsEnumerable():
var words = (from p in db.Words
where p.Document.Corpus.Name == corpus)
select p)
.AsEnumerable()
.Where(p => /* distance function */ < threshold);
AsEnumerable强制LINQ to SQL枚举查询结果,允许使用LINQ to Objects和距离委托解析剩余的查询(而不是转换为SQL)。