Linq to Entities: не распознает метод - PullRequest
2 голосов
/ 20 декабря 2011

Я пытаюсь использовать запрос выбора Levenshtein Distance Linq (как показано ниже), он выдает исключение.

IEnumerable<Host> closeNeighbours = (from h in _dbContext.People
                                         let lD = Utilities.LevenshteinDistance(lastName, h.LastName)
                                         let length = Math.Max(h.LastName.Length, LastName.Length)
                                         let score = 1.0 - (double)lD / length
                                         where score > fuzziness

                                         select h);



public static int LevenshteinDistance(string src, string dest)
{
    int[,] d = new int[src.Length + 1, dest.Length + 1];
    int i, j, cost;
    char[] str1 = src.ToCharArray();
    char[] str2 = dest.ToCharArray();

    for (i = 0; i <= str1.Length; i++)
    {
        d[i, 0] = i;
    }
    for (j = 0; j <= str2.Length; j++)
    {
        d[0, j] = j;
    }
    for (i = 1; i <= str1.Length; i++)
    {
        for (j = 1; j <= str2.Length; j++)
        {

            if (str1[i - 1] == str2[j - 1])
                cost = 0;
            else
                cost = 1;

            d[i, j] =
                Math.Min(
                    d[i - 1, j] + 1,              // Deletion
                    Math.Min(
                        d[i, j - 1] + 1,          // Insertion
                        d[i - 1, j - 1] + cost)); // Substitution

            if ((i > 1) && (j > 1) && (str1[i - 1] ==
                str2[j - 2]) && (str1[i - 2] == str2[j - 1]))
            {
                d[i, j] = Math.Min(d[i, j], d[i - 2, j - 2] + cost);
            }
        }
    }

    return d[str1.Length, str2.Length];
}

Кажется, это не работает. Любая альтернатива?

Исключение: System.NotSupportedException не было обработано кодом пользователя Сообщение = LINQ to Entities не распознает метод метода Int32 LevenshteinDistance (System.String, System.String), и этот метод нельзя преобразовать в выражение хранилища. Источник = System.Data.Entity

1 Ответ

2 голосов
/ 20 декабря 2011

Вы не можете использовать эту функцию в запросе структуры объекта, так как EF не сможет перевести ее в соответствующий TSQL. Вам нужно будет перенести исходную последовательность в память, разрешив любые фильтры, применимые к базе данных, а затем выполнить остальное в linq-to-objects. Это только тонкое изменение.

var closeNeighbors = from h in db.People.AsEnumerable() // bring into memory
                     // query continued below as linq-to-objects
                     let lD = Utilities.LevenshteinDistance(lastName, h.LastName) 
                     let length = Math.Max(h.LastName.Length, LastName.Length) 
                     let score = 1.0 - (double)lD / length 
                     where score > fuzziness 
                     select h; 

Все до AsEnumerable() произойдет в базе данных. Если существуют фильтры, обычно применимые к People, вы можете использовать их до вызова AsEnumerable(). Пример

var mixedQuery = db.People
                     .Where(dbPredicate).OrderBy(dbOrderSelector) // at the database
                     .AsEnumerable() // pulled into memory
                     .Where(memoryPredicate).OrderBy(memoryOrderSelector);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...