LINQ to SQL - 自定义函数

时间:2009-11-09 03:17:36

标签: c# linq linq-to-sql

我想运行这样的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转换。

有没有正确的方法呢?

1 个答案:

答案 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)。