在 GroupBy 之前查询 Where

Query with Where before GroupBy

我有一个这样的实体:

public class Event
{
    public string Code;
    public DateTimeOffset DateTime;
}

我想按 Code 筛选,然后按 DateTime.Date 分组。我试过这个:

var results = session
    .Query<Event>()
    .Where(e => e.Code == "123")
    .GroupBy(e => e.DateTime.Date)
    .ToList();

但是我收到以下错误:

Raven.Client.Exceptions.InvalidQueryException: Field 'Code' isn't neither an aggregation operation nor part of the group by key
Query: from Events group by DateTime.Date where Code = $p0
Parameters: {"p0":"123"}

从结果查询可以看出,where子句是在group by子句之后添加的,这就解释了错误。

那么如何在 RavenDB 中执行此查询?

编辑:

我使用的code“123”只是一个例子。我需要它是传递给查询的变量,如下所示:

var results = session
    .Query<Event>()
    .Where(e => e.Code == code)
    .GroupBy(e => e.DateTime.Date)
    .ToList();

首先,了解 dynamic aggregation query syntax
https://demo.ravendb.net/demos/auto-indexes/auto-map-reduce-index

但是,在你的情况下你需要定义一个Static Map-Reduce Index来为你计算:
(总结每个唯一日期的(过滤的)文档数)

 public class Result
 {
     public string  Date { get; set; }
     public int NumberOfDocs { get; set; }
 }

 Map = events => from event in events
     where event.Code == "123"
     select new Result  
     {           
        Date = event.DateTime.Date
        NumberOfDocs = 1         
     }     

 Reduce = results => from result in results  
     group result by result.Date into g
     select new Result 
     {
        Date = g.Key,
        Count = g.Sum(x => x.NumberOfDocs )
     }

==> 在以下位置了解 Static Map-Reduce Index
https://demo.ravendb.net/demos/static-indexes/map-reduce-index
按照详细的演练..

------------

更新: 您可以使用以下 map-reduce 索引聚合每个代码和日期 'couple' 的文档数量 ,然后您可以使用 'Code'[=18= 进行查询]

public class Result
{
      public string Code { get; set; }
      public string  Date { get; set; }
      public int NumberOfDocs { get; set; }
}

         Map = events => from event in events        
             select new Result  
             {          
                Code = event.Code
                Date = event.DateTime.Date             
                NumberOfDocs = 1         
             }     

         Reduce = results => from result in results  
             group result by new 
             {
               result.Code,
               result.Date
             }
             into g
             select new Result 
             {
                Code = g.Key.Code
                Date = g.Key.DateTime.Date,
                NumberOfDocs = g.Sum(x => x.NumberOfDocs )
             }

然后查询

List<Result> queryResults = session.Query< Result, <Index_Name> >()
                    .Where(x => x.Code == "some-code-number")
                    .ToList();

然后你也可以在你的代码中做

queryResults.GroupBy(x => x.Date)