2009-11-09 99 views
1

我想運行一個LINQ查詢是這樣的:LINQ到SQL - 自定義函數

var words = from p in db.Words 
    where p.Document.Corpus.Name == corpus 
    //where LevenshteinDistance(p.Text.ToCharArray(), word.ToCharArray()) < threshold 
    select p; 

但是,如果我把在「編輯距離」功能,在那裏它會產生一個錯誤:

NotSupportedException: Method 'Char[] ToCharArray()' has no supported translation to SQL.

有沒有正確的方法來做到這一點?

回答

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