Сопоставление / уменьшение в RavenDB создает исключение InvalidOperationException - PullRequest
3 голосов
/ 12 января 2012

У меня проблемы с получением карты / сокращением операции до работы. Я увлекаюсь C #, поэтому, вероятно, отчасти из-за отсутствия у меня опыта работы с lambda и linq для тщательного анализа и понимания причины (что такое выражение создания объекта), приводящей к ошибке.

Код компилируется отлично, но при выполнении он выдает исключение, и я не понимаю, какая часть не верна.

Когда я отключаю операцию уменьшения, ошибка остается, поэтому я предполагаю, что это связано с часть карты.

Версия RavenDB: RavenDB-Build-573

Это исключение: System.InvalidOperationException: Variable выбор инициализатора должен иметь лямбда-выражение с объектом create выражение

И я предоставляю RavenDB такой индекс:

IndexCreation.CreateIndexes(typeof(FullTree).Assembly, store);

Объект Entity - это простой класс, имеющий int Id и int ParentId.

Это карта / уменьшенная часть:

public class FullTreeObject
{
    public int Id { get; set; }
    public int Count { get; set; }
    public int ParentId { get; set; }
}

public class FullTree : AbstractIndexCreationTask<Entity,FullTreeObject>
   {
       public FullTree()
       {

           Map = entities => from entity in entities
                             let ids = new object[]
                               {
                                   new { entity.Id, Count = 0,
entity.ParentId },
                                   new { Id = entity.ParentId, Count
= 1, ParentId = (string)null}
                               }
                             from id in ids
                             select id;

           Reduce = results => from result in results
                               group result by result.Id into g
                               let parent = g.FirstOrDefault(x =>
x.ParentId != null)
                               select new
                               {
                                   Id = g.Key,
                                   Count = g.Sum(x => x.Count),
                                   ParentId = parent ==
(object)null ? (object)null : parent.ParentId
                               };

       }
   }

Надеюсь, кто-нибудь может дать мне некоторые подсказки. Заранее спасибо.

-

В ответ на ввод я модифицировал карту / уменьшить реализацию. RavenDB требует отображения и уменьшения вывода того же типа, но, честно говоря, это не может быть правильным, так как я выводю значения объекта-сущности, а не те, которые получены в массиве. Но я не могу достичь этих значений с помощью intellisense.

Индекс создается в студии RavenDB, но результаты не возвращаются, поэтому я могу предположить, что моя реализация ошибочна.

public class FullTree : AbstractIndexCreationTask<Entity,FullTreeObject>
    {
        public FullTree()
        {
            Map = entities => from entity in entities
                              let ids = new object[]
                                { 
                                    new { entity.Id, Count = 0, entity.ParentId }, 
                                    new { Id = entity.ParentId, Count = 1, ParentId = (string)null} 
                                } 
                              from id in ids
                              select new { 
                                    entity.Id,
                                    Count = 1,
                                    entity.ParentId
                              };


            Reduce = results => from result in results
                                group result by result.Id into g
                                let parent = g.FirstOrDefault(x => x.ParentId != null)
                                select new
                                {
                                    Id = g.Key,
                                    Count = g.Sum(x => x.Count), 
                                    ParentId = parent == (object)null ? (object)null : parent.ParentId
                                };
        }
    }

Обновление в сборке 601:

public class FullTree : AbstractIndexCreationTask<Entity, FullTree.ReduceResult>
{

    public class ReduceResult
    {
        public int Id { get; set; }
        public int Count { get; set; }
        public int ParentId { get; set; }
    } 
    public FullTree()
    {
        Map = entities => from entity in entities
                          let items = new[]
                            { 
                                new { Id = (int) entity.Id, Count = (int) 0, ParentId = (int) entity.ParentId }, 
                                new { Id = (int) entity.ParentId, Count = (int) 1, ParentId = (int) 0} 
                            } 
                          from item in items
                          select new { 
                                Id = item.Id,
                                Count = item.Count,
                                ParentId = item.ParentId
                          };


        Reduce = results => from result in results
                            group result by result.Id into g
                            let itemWithParent = g.FirstOrDefault(x => x.ParentId != 0)
                            select new
                            {
                                Id = g.Key,
                                Count = g.Sum(x => x.Count),
                                ParentId = (itemWithParent == null) ? (int)0 : itemWithParent.ParentId
                            };
    }
}

Ошибка вернулась: [WebException: удаленный сервер возвратил ошибку: (500) Внутренняя ошибка сервера.] System.Net.HttpWebRequest.GetResponse () +6111651 Raven.Client.Connection.HttpJsonRequest.ReadStringInternal (Func`1 getResponse) в c: \ Builds \ raven \ Raven.Client.Lightweight \ Connection \ HttpJsonRequest.cs: 231

[InvalidOperationException: { "Url": "/ indexes / FullTree", «Ошибка»: «System.InvalidOperationException: не удалось понять запрос: \ r \ n-- строка 2, столбец 55: недопустимое выражение NewExpression \ r \ n-- строка 2, столбец 91: невозможно проанализировать значение типа double .0.0 \ r \ n- - строка 2 столбец 183: невозможно разобрать double .0.0 \ r \ n-- строка 2 столбец 275: невозможно разобрать double .0.0 \ r \ n \ r \ n в Raven.Database.Linq.QueryParsingUtils.GetVariableDeclarationForLinqMethods ( Строковый запрос, Boolean требуетSelectNewAnonymousType) в c: \ Builds \ raven-unstable \ Raven.Database \ Linq \ QueryParsingUtils.cs: строка 122 \ r \ n в Raven.Database.Linq.DynamicViewCompiler.TransformMapDefinitionFromLinqMethodSamering String query, String, String, String c: \ Builds \ raven-unstable \ Raven.Database \ Linq \ DynamicViewCompiler.cs: строка 355 \ r \ n в Raven.Database.Linq.DynamicViewCompiler.HandleMapFunction (ConstructorDeclaration ctor, String map) в c: \ Builds \ raven- unstable \ Raven.Database \ Linq \ DynamicViewCompiler.cs: строка 132 \ r \ n в Raven.Database.Linq.DynamicViewCompiler.TransformQueryToClass () в c: \ Builds \ raven-unstable \ Raven.Database \ Linq \ DynamicViewC ompiler.cs: строка 97 \ r \ n в Raven.Database.Linq.DynamicViewCompiler.GenerateInstance () в c: \ Builds \ raven-unstable \ Raven.Database \ Linq \ DynamicViewCompiler.cs: строка 489 \ r \ n в Raven .Database.DocumentDatabase.PutIndex (имя строки, определение IndexDefinition) в c: \ Builds \ raven-unstable \ Raven.Database \ DocumentDatabase.cs: строка 717 \ r \ n в Raven.Database.Server.Responders.Index.Put ( IHttpContext context, String index) в c: \ Builds \ raven-unstable \ Raven.Database \ Server \ Responders \ Index.cs: строка 72 \ r \ n в Raven.Database.Server.Responders.Index.Respond (контекст IHttpContext) в c: \ Builds \ raven-unstable \ Raven.Database \ Server \ Responders \ Index.cs: строка 49 \ r \ n в Raven.Database.Server.HttpServer.DispatchRequest (IHttpContext ctx) в c: \ Builds \ raven- unstable \ Raven.Database \ Server \ HttpServer.cs: строка 527 \ r \ n в Raven.Database.Server.HttpServer.HandleActualRequest (IHttpContext ctx) в каталоге c: \ Builds \ raven-unstable \ Raven.Database \ Server \ HttpServer. CS: линия 303 " }]Raven.Client.Connection.HttpJsonRequest.ReadStringInternal (Func`1 getResponse) в c: \ Builds \ raven \ Raven.Client.Lightweight \ Connection \ HttpJsonRequest.cs: 295

Ответы [ 3 ]

1 голос
/ 12 января 2012

Проблема в том, что функция Map должна возвращать анонимный тип (сейчас этого не происходит).Кроме того, этот анонимный тип должен иметь те же свойства, что и класс, который вы определили как результат индекса.

Я не знаю, как это лучше описать, но как правило, можно сказать, что функция карты всегда должна заканчиваться на select new { YourPropertyName = propValue }

1 голос
/ 19 января 2012

Миха, ошибка теперь исправлена.Он находится в сборке 601. Чтобы увидеть, как вы на самом деле можете реализовать индекс, подобный тому, который вы просили, взгляните на этот тест: https://github.com/ayende/ravendb/blob/master/Raven.Tests/Bugs/MapRedue/TreeWithChildrenCount.cs

0 голосов
/ 12 января 2012

У меня нет удобного экземпляра ворона, но попробуйте заменить ParentId = (string) null на ParentId = -1 и посмотреть, поможет ли это.У меня было несколько проблем с попыткой присвоить нулям в моих индексах, как это.Очевидно, что это не решает проблему, но может помочь выявить ее.

...