Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个表的Linq_C#_.net_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 具有多个表的Linq

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

在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/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);
  • 筛选要在指定日期范围内的视图
  • 按文章Id对它们进行分组
  • 为每个项目创建一个匿名对象,存储项目Id和该项目的视图计数
  • 以计数最高的那个为例

  • 您可以通过使用联接执行以下操作:

    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)
    
  • 按某个日期范围筛选
  • 按项目ID分组
  • 按最上面的计数排序
  • 通过导航属性选择
    文章
  • 只取第一个