Linq на заказ по количеству совпадений - PullRequest
2 голосов
/ 10 сентября 2011

У меня есть массив строк и запрос Linq:

/// <summary>
/// Return all the search results
/// </summary>
public static GenericTagEntity[] getSearchResults(int SectionID, string[] Words)
{
    GenericTagEntity[] Recs;

    using (MainContext db = new MainContext())
    {
        var q = (
            from c in db.tblArticles
            join a in db.tblForumAuthors on c.AuthorID equals a.Author_ID
            join u in db.tblProfiles on c.AuthorID equals u.UserID
            where c.IsDeleted == false
            && c.SectionID == SectionID
            select new
            {
                c.Title,
                c.ID,
                c.Anchor,
                c.Date,
                c.Description,
                u.EmailAddress,
                u.UserID,
                a.Username,
                c.Body,
                comments = (from f in db.tblComments where f.IsDeleted == false && f.Anchor == c.Anchor select new { f.ID }).Count()
            });

Что я хотел бы сделать, это изменить where так, чтобы он возвращал результаты, где c.Title ИЛИ c.Body содержатодно или несколько слов.Затем мне нужно, чтобы он был упорядочен по количеству совпадений (наиболее актуально в первую очередь)!

Это кажется мне действительно трудным, любая помощь очень ценится.

Я нашел это, но это лишь частично полезноТак что поиск не дал много результатов.http://msdn.microsoft.com/en-us/library/bb546166.aspx#Y200

Ответы [ 2 ]

3 голосов
/ 10 сентября 2011

Я верю, что это поможет

var occurrences = from e in q.Title.Split(new char[] { ' ' }).Concat(q.Body.Split(new char[] { ' ' }))
             join word in Words on e equals word
             group e by e into g
             select new {element = g, count = g.Count()} into result
             orderby result.count descending
             select result;

Запрос выдаст список слов, которые либо в заголовке, либо в теле упорядочены по убыванию по количеству вхождений.

3 голосов
/ 10 сентября 2011

Грустно ломать это вам, но вы используете неправильный инструмент для решения этой проблемы. Либо создайте полнотекстовый индекс в БД и запустите полнотекстовый поиск из LINQ через пользовательскую функцию, либо используйте стороннюю строку системы полнотекстового поиска Lucene.

Если вы действительно хотите сделать это в sql, считайте нет. экземпляров слова в документе потребует от вас изменения схемы БД.

Вам нужна таблица слов (id, word) и таблица вхождений (wordid, articleid), а затем вы можете выполнить запрос к таблице вхождений, чтобы получить нужные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...