我有三个类(针对这个问题简化):
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.
}