2009-11-09 6 views
1

Je voudrais exécuter une requête LINQ comme ceci:LINQ to SQL - fonction personnalisée

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

Mais si je place la fonction "distance de levenshtein" là-bas, il génère une erreur:

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

Y a-t-il une façon correcte de faire cela?

Répondre

6

LINQ to SQL tente de traduire l'expression entière en SQL. Si vous souhaitez exécuter votre fonction de distance sur SQL Server, vous devez définir une fonction UDF SQL Server et mapper une méthode CLR personnalisée à cette fonction. Si vous êtes content d'obtenir tous les résultats, puis filtre côté client sur la fonction de la distance, utilisez AsEnumerable():

var words = (from p in db.Words 
      where p.Document.Corpus.Name == corpus) 
      select p) 
      .AsEnumerable() 
      .Where(p => /* distance function */ < threshold); 

Les forces AsEnumerable LINQ to SQL pour énumérer les résultats de la requête, permettant au reste de la requête à résoudre en utilisant LINQ to Objects et votre délégué à distance (au lieu d'être traduit en SQL).