попробуйте вставить order by a.Body.Split(' ').Count(w=>w == keyword)
. Это должно позволить вам увидеть, что концепция работает. Однако я НАСТОЯТЕЛЬНО рекомендую включить в окончательную версию это как часть проекции выбора, возможно, используя пару ключ-значение, и упорядочить по имени свойства:
string keyword = "SomeKeyword";
//EDIT: restructured query to force the ordering to be done on the projection,
//not the source.
IQueryable<Article> searchResults = (from a in GenesisRepository.Article
where a.Body.Contains(keyword)
select new KeyValuePair<int, Article>(
a.Body.Split(' ').Count(w=>w == keyword), a))
.OrderBy(kvp=>kvp.Key);
причина в производительности; цепочка методов Split (). Count () имеет линейную сложность и будет оцениваться при каждом сравнении двух значений, что делает общую сложность N ^ 2logN сортировки (медленной).
РЕДАКТИРОВАТЬ: Также следует понимать, что a.Body.Contains (ключевое слово) не будет выполнять поиск по целым словам и поэтому будет возвращать статьи, которые содержат «SomeKeywordLongerThanSearch» и «ThisIsSomeKeyword», а также «SomeKeyword». Этого можно избежать, сопоставив регулярное выражение с шаблоном "\ bSomeKeyword \ b", который будет сопоставлять только экземпляры SomeKeyword с границей слова непосредственно перед и после.