Запрос с Где до GroupBy - PullRequest
1 голос
/ 20 марта 2019

У меня есть такая сущность:

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"}

Из полученного запроса видно, что после * 1013 добавляется предложение where* условие, которое объясняет ошибку.

Итак, как мне выполнить этот запрос в RavenDB?

РЕДАКТИРОВАТЬ:

code "123", который я использовал, был простопример.Мне нужно, чтобы это была переменная, которая передается в запрос, например:

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

1 Ответ

1 голос
/ 20 марта 2019

Для начала ознакомьтесь с синтаксисом запроса динамического агрегирования in:
https://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 )
     }

==> Подробнее о Индекс уменьшения статической карты in:
https://demo.ravendb.net/demos/static-indexes/map-reduce-index
Следуйте подробным инструкциям.

----------

Обновление : Можно использовать следующий индекс карты-уменьшения, который агрегирует количество документов на код и дату «пара» , а затем вы можете запросить с помощью «Код»

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)
...