在 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)
我有一个这样的实体:
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)