Ошибка в EntitySchemaQuery

Доброго времени суток! Возникла следующая проблема:
В бизнес-процессе есть запрос:

EntitySchemaQuery CountOfOrderesq = new EntitySchemaQuery(UserConnection.EntitySchemaManager,"UsrOrderProvidersProduct");
CountOfOrderesq.IsDistinct = true;
CountOfOrderesq.AddAllSchemaColumns();
CountOfOrderesq.Filters.Add(CountOfOrderesq.CreateFilterWithParameters(FilterComparisonType.Equal, "UsrOrderId", OrderId));
CountOfOrderesq.Filters.Add(CountOfOrderesq.CreateFilterWithParameters(FilterComparisonType.Greater, "UsrShipped", 0));
var CountOfOrders = CountOfOrderesq.GetEntityCollection(UserConnection);

Далее его результат вызывается в цикле

foreach (var Order in CountOfOrders){
        EntitySchema Activityschema = UserConnection.EntitySchemaManager.GetInstanceByName("Activity");
        var OrderNumber = Order.GetTypedColumnValuestring>("UsrClientsOrderId.Number");//вот здесь
        var ClientsOrder = Order.GetTypedColumnValueGuid>("UsrClientsOrderId");
        var ActivityEntity = Activityschema.CreateEntity(UserConnection);
        ActivityEntity.SetDefColumnValues();
        ActivityEntity.SetColumnValue("Title", "Повторная комплектация по заказу клиента " + OrderNumber);
        ActivityEntity.SetColumnValue("UsrComplicateAftProvidersOrder", true);
        ActivityEntity.SetColumnValue("TypeId", "ad9476d6-cec0-4c69-b361-c80db1670fb5");//тип комплектация
        ActivityEntity.SetColumnValue("OrderId", ClientsOrder);
        ActivityEntity.Save();
        ActivityEntities.Add(ActivityEntity);
}

При выполнении появляется ошибка:

Terrasoft.Common.ItemNotFoundException: Значение с именем "UsrClientsOrderId.Number" не найдено
в Terrasoft.Core.Entities.EntityColumnValueCollection.GetByName(String name)
в Terrasoft.Core.Entities.Entity.InternalGetColumnValue(String valueName)
в Terrasoft.Core.Entities.Entity.GetTypedColumnValue[TResult](String valueName)
в Terrasoft.Core.Process.UsrProcess1.ScriptTask1Execute(ProcessExecutingContext context)
в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Sql-текст запроса:

SELECT DISTINCT
 [UsrOrderProvidersProduct].[Id] [Id],
 [UsrOrderProvidersProduct].[CreatedOn] [CreatedOn],
 [UsrOrderProvidersProduct].[CreatedById] [CreatedById],
 [CreatedBy].[Name] [CreatedBy.Name],
 [CreatedBy].[PhotoId] [CreatedBy.PhotoId],
 [UsrOrderProvidersProduct].[ModifiedOn] [ModifiedOn],
 [UsrOrderProvidersProduct].[ModifiedById] [ModifiedById],
 [ModifiedBy].[Name] [ModifiedBy.Name],
 [ModifiedBy].[PhotoId] [ModifiedBy.PhotoId],
 [UsrOrderProvidersProduct].[ProcessListeners] [ProcessListeners],
 [UsrOrderProvidersProduct].[UsrProductId] [UsrProductId],
 [UsrProduct].[Name] [UsrProduct.Name],
 [UsrProduct].[PictureId] [UsrProduct.PictureId],
 [UsrOrderProvidersProduct].[UsrQuantity] [UsrQuantity],
 [UsrOrderProvidersProduct].[UsrUnitId] [UsrUnitId],
 [UsrUnit].[Name] [UsrUnit.Name],
 [UsrOrderProvidersProduct].[UsrOrderIdId] [UsrOrderIdId],
 [UsrOrderId].[Number] [UsrOrderId.Number],
 [UsrOrderProvidersProduct].[UsrCompleted] [UsrCompleted],
 [UsrOrderProvidersProduct].[UsrShipped] [UsrShipped],
 [UsrOrderProvidersProduct].[UsrClientsOrderIdId] [UsrClientsOrderIdId],
 [UsrClientsOrderId].[Number] [UsrClientsOrderId.Number],
 [UsrOrderProvidersProduct].[UsrMust] [UsrMust],
 [UsrOrderProvidersProduct].[UsrProcessed] [UsrProcessed],
 [UsrOrderProvidersProduct].[UsrTotalAmountWithoutVAT] [UsrTotalAmountWithoutVAT]
 
 FROM [dbo].[UsrOrderProvidersProduct] [UsrOrderProvidersProduct]

 WITH(NOLOCK) LEFT OUTER JOIN [dbo].[Contact] [CreatedBy]
 WITH(NOLOCK) ON ([CreatedBy].[Id] = [UsrOrderProvidersProduct].[CreatedById]) LEFT OUTER JOIN [dbo].[Contact] [ModifiedBy]
 WITH(NOLOCK) ON ([ModifiedBy].[Id] = [UsrOrderProvidersProduct].[ModifiedById]) LEFT OUTER JOIN [dbo].[Product] [UsrProduct]
 WITH(NOLOCK) ON ([UsrProduct].[Id] = [UsrOrderProvidersProduct].[UsrProductId]) LEFT OUTER JOIN [dbo].[Unit] [UsrUnit]
 WITH(NOLOCK) ON ([UsrUnit].[Id] = [UsrOrderProvidersProduct].[UsrUnitId]) LEFT OUTER JOIN [dbo].[ORDER] [UsrOrderId]
 WITH(NOLOCK) ON ([UsrOrderId].[Id] = [UsrOrderProvidersProduct].[UsrOrderIdId]) LEFT OUTER JOIN [dbo].[ORDER] [UsrClientsOrderId]
 WITH(NOLOCK) ON ([UsrClientsOrderId].[Id] = [UsrOrderProvidersProduct].[UsrClientsOrderIdId])

 WHERE [UsrOrderProvidersProduct].[UsrOrderIdId] = @P1 AND [UsrOrderProvidersProduct].[UsrShipped] > @P2

Подскажите пожалуйста решение проблемы. Заранее спасибо!

Нравится

10 комментариев

Здравствуйте, Олег!

Попробуйте убрать Id в Вашем запросе:

var OrderNumber = Order.GetTypedColumnValue("UsrClientsOrder[s]Id[/s].Number");//вот здесь
var ClientsOrder = Order.GetTypedColumnValue("UsrClientsOrder[s]Id[/s]");

Приставка Id добавляется автоматически к колонкам типа Guid.

Здравствуйте, Андрей!

Так называются поля в объекте, если убрать Id то система вообще их не найдет.

Олег,

попробуйте переименовать колонку в объекте (убрать id) и применить рекомендацию выше.

Сообщите, пожалуйста, результат.

Андрей,

Заменили данное поле на "UsrClientOrder", ошибка повторяется снова.

var ClientsOrder = Order.GetTypedColumnValue("UsrClientsOrderId");
Так же уточню, что эта строка работает, ошибка появляется именно в обращении к "UsrClientsOrderId.Number".

Олег,
давайте попробуем следующим образом:

var countColumnName = Order.AddColumn("UsrClientsOrderId.Number").Name;
var OrderNumber = Order.GetTypedColumnValue<string>(countColumnName);

Андрей, решили проблему другим способом, тот что выше выдает ту же самую ошибку.

var OrderNumber = Order.GetTypedColumnValue<string>("UsrClientsOrderIdNumber");

Выяснилось, что колонки в коллекции называются так же как в запросе, но БЕЗ точки.

Добрый день Олег!!!

я бы еще рекомендовал при создание EntitySchemaQuery запросов, заранее "составному полю" присваивать свои Алиасы. Тогда при обработки значений запроса вам легче будет обрабатывать результаты запроса.

так же бы не рекомендовал при составление EntitySchemaQuery запросов включать все столбцы из EntitySchema, когда в результате к примеру вам нужны только 2 или 3 столбца. Это очень сильно влияет на производительность ваших страниц.

Здравствуйте, Михаил!

Спасибо за советы! Один вопрос, а каким образом присваивается Алиас к к колонке в запросе?

Про производительность в курсе, результат этого запроса используется еще в нескольких местах и используются практически все колонки.

Добрый день Олег!!!

в вашем примере вы получаете все колонки из EntitySchema  CountOfOrderesq.AddAllSchemaColumns(); а я бы рекомендовал получать именно те колонки которые потом будут использоваться в обработке запроса. По вопросу Алиаса для колонки в EntitySchemaQuery:  ESQ.AddColumn("ReverseRelationType.Id", "ReverseRelationTypeId")  , где  ReverseRelationTypeId это и есть наш Алиас.

Спасибо!

Показать все комментарии