C# 具有多个表的Linq
在ASP.NETMVC4中使用实体框架,需要使用linq输出一行信息 我有一个ArticleView表和一个Article表。我需要在24小时内输出一篇最活跃的文章 这是我的ArticleView表:C# 具有多个表的Linq,c#,.net,linq,entity-framework,linq-to-entities,C#,.net,Linq,Entity Framework,Linq To Entities,在ASP.NETMVC4中使用实体框架,需要使用linq输出一行信息 我有一个ArticleView表和一个Article表。我需要在24小时内输出一篇最活跃的文章 这是我的ArticleView表: int ArticleID DateTime ViewCreated int ID string title ArticleView: ArticleID ViewCreated 2 4/8/2014 1:48:40 PM 2 4/8/201
int ArticleID
DateTime ViewCreated
int ID
string title
ArticleView:
ArticleID ViewCreated
2 4/8/2014 1:48:40 PM
2 4/8/2014 1:50:40 PM
2 4/8/2014 1:55:20 PM
3 4/8/2014 12:07:30 PM
var articles = db.Articles;
var articleviews = db.ArticleViews;
文章表:
int ArticleID
DateTime ViewCreated
int ID
string title
ArticleView:
ArticleID ViewCreated
2 4/8/2014 1:48:40 PM
2 4/8/2014 1:50:40 PM
2 4/8/2014 1:55:20 PM
3 4/8/2014 12:07:30 PM
var articles = db.Articles;
var articleviews = db.ArticleViews;
样本数据:
int ArticleID
DateTime ViewCreated
int ID
string title
ArticleView:
ArticleID ViewCreated
2 4/8/2014 1:48:40 PM
2 4/8/2014 1:50:40 PM
2 4/8/2014 1:55:20 PM
3 4/8/2014 12:07:30 PM
var articles = db.Articles;
var articleviews = db.ArticleViews;
注意:ViewCreated是在有人查看文章后自动生成的
Article:
ID Title
2 Article2
3 Article3
预期输出:
int ArticleID
DateTime ViewCreated
int ID
string title
ArticleView:
ArticleID ViewCreated
2 4/8/2014 1:48:40 PM
2 4/8/2014 1:50:40 PM
2 4/8/2014 1:55:20 PM
3 4/8/2014 12:07:30 PM
var articles = db.Articles;
var articleviews = db.ArticleViews;
24小时内活动最多的物品是:
第2(3)条
我必须处理的问题:
int ArticleID
DateTime ViewCreated
int ID
string title
ArticleView:
ArticleID ViewCreated
2 4/8/2014 1:48:40 PM
2 4/8/2014 1:50:40 PM
2 4/8/2014 1:55:20 PM
3 4/8/2014 12:07:30 PM
var articles = db.Articles;
var articleviews = db.ArticleViews;
只是不知道如何处理这个问题。类似这样的问题:
var viewsById = db.ArticleViews
.Where(av => av.ViewCreated >= startDateTime && av.ViewCreated < endDateTime)
.GroupBy(av => av.ArticleId)
.Select(g => new { ArticleId = g.Key, Count = g.Count() })
var highestCount = viewsById.Max(v => v.Count);
var topArticles = viewsById.Where(a => a.Count == highestCount);
var topArticle = topArticles.First();
var message = String.Format("Article id: {0}, views: {1}",
topArticle.ArticleId, topArticle.Count);
var viewsbyd=db.ArticleViews
.Where(av=>av.ViewCreated>=startDateTime&&av.ViewCreatedav.ArticleId)
.Select(g=>new{ArticleId=g.Key,Count=g.Count()})
var highestCount=viewsbyd.Max(v=>v.Count);
var topArticles=viewsbyd.Where(a=>a.Count==highestCount);
var topArticle=topArticles.First();
var message=String.Format(“项目id:{0},视图:{1}”),
topArticle.ArticleId,topArticle.Count);
您可以通过使用联接执行以下操作:
var mostViewedArticleTitleAndCount = db.Articles
.Join(ArticleViews.Where (av => av.ViewCreated > sinceDate),
a => a.ID,
v => v.ArticleID,
(a,v) => new { a,v })
.GroupBy (g => g.a.ID)
.Select (g => new { g.Key, Title = g.First ().a.Title, Count = g.Count ()})
.OrderByDescending (g => g.Count)
.Select (g => g.Title + "(" + g.Count + ")")
.First ();
对于您的测试数据,这将输出:
第2(3)条
要获得文章,您只需执行以下操作:
var article = db.Articles.OrderByDescending(a=>a.ArticleViews.Count())
.Take(1).FirstOrDefault();
或
此处建议解决方案的一个较短方法是:
var mostViewedArticle = db.ArticleViews
.Where(av => av.ViewCreated >= startDateTime && av.ViewCreated < endDateTime)
.GroupBy(av => av.ArticleId)
.OrderByDescending(g=> g.Count())
.Select(g => g.First().Article)
.Take(1)
var mostViewedArticle=db.ArticleViews
.Where(av=>av.ViewCreated>=startDateTime&&av.ViewCreatedav.ArticleId)
.OrderByDescending(g=>g.Count())
.Select(g=>g.First().Article)
.采取(1)
文章