匹配LINQ查询中的两个字符串枚举



我有三个类(针对这个问题简化):

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"-对象,因为如果只有title(字符串)相同,则关键字应该匹配。

实际上,这3个类是数据库中的表。我使用EntityFramework连接到数据库。语言是C#。该项目是一个ASP.NET MVC 3网站。

如果可能的话,我的问题的解决方案应该是LINQ查询。

我希望有人能解决这个问题——我尝试了很多不同的事情,但都没有成功。

提前感谢您的帮助。

DanielD

IEnumerable<News> news = …;
Page page = …;
var newsOnPage = news.Where(n => page.Keywords.All(pk => n.Keywords.Contains(pk)));

这是假设默认比较器比较关键字可以正常工作。

新闻关键字和页面关键字的交集必须产生所有页面关键字。所有页面关键字都必须出现在新闻关键字中。我也遇到过类似的情况,下面是我的做法。

if (ANews.Keywords.Intersect(APage.Keywords).Count() == APage.Keywords.Count())
{
     // Display news.
}

相关内容

  • 没有找到相关文章

最新更新