2011-06-08 71 views
0

我有3个班(简化了这个问题):字符串匹配的两个枚举在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. 

The 'linked'元素是字符串'KeywordTitle',而不是Guid'KeywordGuid'或'Keyword'对象,因为如果标题(字符串)是相同的,则关键字应该匹配。

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

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

我希望有人有这个解决方案 - 我尝试了很多不同的东西,但没有成功。

在此先感谢您的帮助。

DanielD

回答

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

这是假设由默认的比较来比较关键字按预期工作。

+0

这适用于PageA,PageB,PageC情况下的上例。 PageD不幸地显示新闻条目,尽管它不应该是因为这三个关键字Kw1,Kw2,Kw3没有出现在任何新闻中。 – 2011-06-08 23:28:17

+0

不,PageD不会使用此代码显示任何新闻条目。 – svick 2011-06-08 23:40:55

+0

好吧,@svick,看起来你是对的。 Mea culpa!这是我的错。 但我在我的一个更复杂的实际代码中试了一下,在我的下面的代码中有一个选项显示一些消息,虽然没有消息关键字匹配以防止显示空的新闻页面。 可悲的是又出现了另一个问题:我简单地简化了我的第一个代码示例,我现在更新了它。新问题是,页面和新闻类中没有“KeywordTitles”的列表<>。我有一个链接“关键字”的枚举<>,并且必须匹配这些对象的'KeywordTitle'。 现在我得到一个LINQ错误。 – 2011-06-09 00:18:24

0

新闻关键词和网页关键字的交叉必然导致所有页面的关键字。所有网页关键字必须出现在新闻关键字中我有类似的情况,这就是我的做法。

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

我需要一个像他的帖子中建议的svick查询结果。 '如果'不行,因为我有很多消息,而不仅仅是一个消息。所以我不能写'ANews.Keywords ...',因为ANews是元素的枚举。 – 2011-06-08 23:27:44