Сопоставление двух перечислений строк в LINQ-запросе - PullRequest
0 голосов
/ 09 июня 2011

У меня есть 3 класса (упрощенно для этого вопроса):

public class Page
{
    public Guid PageUid;
    public string PageTitle;
    public IQueryable<Keyword> Keywords;
}

public class News
    public Guid NewsUid;
    public string NewsTitle;
    public IQueryable<Keyword> Keywords;
}

public class Keyword
    public Guid KeywordUid;
    public string KeywordTitle;
}

Я хочу перечислить все записи новостей на странице, где все (не любые) ключевые слова этой страницы соответствуют некоторым или всемключевые слова новостей.На странице должны отображаться только новости, где все ключевые слова страницы присутствуют в новостях.Если одно из ключевых слов страницы отсутствует в новостях, эта запись не должна отображаться.Но если в новостной записи больше ключевых слов, чем на странице, новость должна отображаться - если ключевые слова страницы также присутствуют в списке ключевых слов этой новости.Если нет, то новости, конечно, не должны быть перечислены.

Довольно сложно объяснить, я пытаюсь набросать реальный пример для лучшего понимания:

Пример:

Определения:

- PageA has 1 keyword:  Kw1
- PageB has 2 keywords: Kw1, Kw2
- PageC has 2 keywords: Kw1,      Kw3
- PageD has 3 keywords: Kw1, Kw2, Kw3

- NewsW has 1 keyword:  Kw1
- NewsX has 2 keywords: Kw1, Kw2
- NewsY has 2 keywords: Kw1,      Kw3
- NewsZ has 3 keywords: Kw1, Kw2,      Kw4

Результаты должны быть:

- PageA displays 4 items:       NewsW, NewsX, NewsY, NewsZ
- PageB lists 2 news:                  NewsX,        NewsZ
- PageC shows only 1 entry:                   NewsY
- PageD has not even one match.

Элементом 'linking' является строка 'KeywordTitle', а не Guid«KeywordGuid» или просто «Keyword» -объект, потому что ключевые слова должны совпадать, если только заголовок (строка) идентичен.

В действительности 3 класса являются таблицами в базе данных.Я подключаюсь к базе данных с EntityFramework.Язык C #.Проект является веб-сайтом ASP.NET MVC 3.

Решением для моей проблемы должен быть LINQ-запрос, если это возможно.

Надеюсь, у кого-то есть решение для этого - я пробовал так много разных вещей, но безуспешно.

Заранее спасибо за помощь.

DanielD

Ответы [ 2 ]

0 голосов
/ 09 июня 2011
IEnumerable<News> news = …;
Page page = …;
var newsOnPage = news.Where(n => page.Keywords.All(pk => n.Keywords.Contains(pk)));

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

0 голосов
/ 09 июня 2011

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

if (ANews.Keywords.Intersect(APage.Keywords).Count() == APage.Keywords.Count())
{
     // Display news.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...