2014-04-08 85 views
3

在ASP.Net MVC 4中使用實體框架,並需要使用linq輸出一行信息。Linq with multiple tables

我有一個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/2014 1:50:40 PM 
    2   4/8/2014 1:55:20 PM 
    3   4/8/2014 12:07:30 PM 

注意:一旦有人查看文章,ViewCreated會自動生成。

Article: 
    ID  Title 
    2  Article2 
    3  Article3 

預期輸出:

文章最活動的24小時內是:

第二條(3)

我有什麼一起工作:

var articles = db.Articles; 
var articleviews = db.ArticleViews; 

只是不知道如何解決這個問題。

回答

2

像這樣:

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); 
  1. 過濾器的觀點是在指定的日期範圍內。
  2. 按文章ID對它們進行分組。
  3. 製作每個對象的匿名對象,存儲文章ID和該文章的視圖數量。
  4. 取最高計數的那個。
0

你可以做到這一點是通過使用連接一個聲明:

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(); 

爲您的測試數據,該輸出:

第二條(3)

0

要拿到文章你可以簡單地做到這一點:

var article = db.Articles.OrderByDescending(a=>a.ArticleViews.Count()) 
       .Take(1).FirstOrDefault(); 

或者

var article = db.Articles.OrderByDescending(a=>a.ArticleViews.Count()) 
       .FirstOrDefault()//this should work too 

建議的解決方案的一個簡短的形式在這裏:

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) 
  1. 過濾一些日期範圍
  2. 分組的條款ArticleID
  3. 排序方式最依次排列
  4. 選擇th e Article通過導航屬性
  5. 只取First一個。