Разделить строку с помощью LINQ - PullRequest
5 голосов
/ 28 декабря 2011

Я хочу заказать по моим результатам с количеством совпадений в моей строке.

Так вот код

.ThenByDescending(p => p.Title.ToLower()
                              .Split(' ')
                              .Count(w => words.Any(w.Contains)));

Но это приносит мне ошибку и говорит, что LINQ не может разобрать Split в SQL.

LINQ to Entities не распознает метод 'System.String [] Split (Char []) ', и этот метод не может быть переведен в сохранить выражение.

Как я могу реализовать Split через LINQ?

Например, для этого массива он должен упорядочиться следующим образом

words = { "a", "ab" }

ab a ggaaag gh //3 matches
ba ab ggt //2 matches
dd //0 matches

Ответы [ 3 ]

8 голосов
/ 28 декабря 2011

это означает, что Linq для сущностей не удалось найти перевод метода split, который можно записать как SQL-запрос.если вы хотите выполнить функции разделения, вы должны перенести запись в память, вызвав ToList(), AsEnumerable() и т. д.

var result = (from t in db.Table
              select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....);
2 голосов
/ 28 декабря 2011

Нельзя ожидать, что LINQ to Entities сможет преобразовать это в SQL.

Лучшее решение состоит в том, чтобы изменить схему так, чтобы каждое слово в заголовке поста сохранялось как отдельная строка в отдельной таблице (с соответствующими ассоциациями). Затем в запросе могут использоваться явные (групповые) операции соединения или свойство ассоциации FK.

Если вы не можете этого сделать и все же хотите, чтобы запрос выполнялся в базе данных, вам нужно будет написать пользовательскую функцию для работы со строками с разделителями. Прочитайте этот вопрос для получения дополнительной информации. Это будет много работы, хотя.

Конечно, самое простое решение (если вы можете себе это позволить) - вернуть все клиенту, просто используйте LINQ to Objects для этой части запроса, как упомянул @Muhammad Adeel Zahid.

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

Вам потребуется выполнить сортировку в LINQ to Objects, поскольку LINQ to Entities не может преобразовать код C # в SQL (или язык любой используемой вами БД).

Вы можете сделать это следующим образом.

var results = 
  objectContext
  .Where(a => a == b) //Whatever
  .AsEnumerable()
  .ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains)));

AsEnumerable() (вместе с ToArray() или ToList()) превращают LINQ to Entities обратно в LINQ to Objects.

...