查询GroupBy之前的位置

问题描述 投票:1回答:1

我有这样一个实体:

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();
c# ravendb
1个回答
1
投票

首先,了解dynamic aggregation query syntaxhttps://demo.ravendb.net/demos/auto-indexes/auto-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 Indexhttps://demo.ravendb.net/demos/static-indexes/map-reduce-index 按照详细的演练..

----------

更新:要使用以下map-reduce索引,该索引汇总每个代码和日期'对'的文档数,然后您可以使用'代码'进行查询

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)
© www.soinside.com 2019 - 2024. All rights reserved.