2011-12-28 3 views
5

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

Так вот код

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

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

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

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

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

words = { "a", "ab" } 

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

ответ

8

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

var result = (from t in db.Table 
       select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....); 
+0

Но это приведет к загрузке всех данных в память и выполнению преобразования LINQ to Objects против него, не так ли? – abatishchev

+0

Да, это правда. Оптимально вы можете применять условия в разделе where перед вызовом 'AsEnumerable'. вы не можете сделать это, не принося объекты в память –

+0

Я думаю, что это сбой с большими таблицами. Я согласен с абатищевым. –

2

Вам нужно будет выполнить сортировку в LINQ к объектам, так как LINQ к 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 для лиц обратно в LINQ к объектам.

2

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

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

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

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