Технические вопросы
5.x

Работа с ESQ

Разбираюсь с ESQ, прямо скажу въехала не до конца ))
Есть простой запрос на T-SQL

SELECT  a.TypePriceId
FROM    ContractN a
WHERE   EXISTS (

                        SELECT b.Id
                        FROM OrderN b
                        WHERE b.Id = @OrderId AND a.AccountId=b.AccountId
                )


Возвращает единичный результат
Наваяла следующее

 

       EntitySchemaManager esqManager = UserConnection.EntitySchemaManager;
        var esq = new EntitySchemaQuery(esqManager, "ContractN");
        esq.AddColumn("=TypePrice.Id");
        var esq1 = new EntitySchemaQuery(esqManager, "OrderN");
        esq1.AddColumn("=Account.Id");
        var esq1Filter = esq1.CreateFilterWithParameters(FilterComparisonType.Equal,false, "Id",  OrderId);
        esq1.Filters.Add(esq1Filter);
        var esqFilter = esq.CreateFilter(FilterComparisonType.Equal,"Account.Id",esq1);
        esq.Filters.Add(esqFilter);


Возвращает идентичный результат, но естественно разница в коде

 

 

SELECT
        [TypePrice].[Id] [TypePrice.Id]
FROM
        [dbo].[ContractN] [ContractN]
        INNER JOIN [dbo].[TypePrice] [TypePrice] ON ([TypePrice].[Id] = [ContractN].[TypePriceId])
WHERE
        EXISTS (
SELECT
        [Account].[Id] [Id]
FROM
        [dbo].[Account] [Account]
WHERE
        [ContractN].[AccountId] = [Account].[Id]
        AND [Account].[Id] IN (
SELECT
        [Account].[Id] [Account.Id]
FROM
        [dbo].[OrderN] [OrderN]
        INNER JOIN [dbo].[Account] [Account] ON ([Account].[Id] = [OrderN].[AccountId])
WHERE
        [OrderN].[Id] = @P))


И разница в стоимости почти в два раза.
Вопрос: можно написать проще?

 

 

Нравится

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

Ещё проблемка возникла, начинаю читать значение,
[csharp]
var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue("TypePrice.Id");
[/csharp]
вылезает следующее исключение:

Значение с именем "TypePrice.Id" не найдено
at Terrasoft.Core.Entities.EntityColumnValueCollection.GetByName(String name)
at Terrasoft.Core.Entities.Entity.GetTypedColumnValue[TResult](String valueName)
at Terrasoft.WebApp.OrderProductEditPageEventsProcess`1.ScriptProductEditChangeExecute(ProcessExecutingContext context)

По первому вопросу, кроме механизма esq существует более низкоуровневый механизм select.

Ваш запрос будет примерно (не запускал, возможны ошибки):
[csharp]
Guid OrderId = ...

var @OrderId = Column.Parameter(OrderId);

var select = new Select(UserConnection).
.Column("ContractN","TypePriceId")
.From("ContractN")
.Where()
.Exists(new Select(UserConnection).Column("OrderN","Id").From("OrderN")
.Where("OrderN","Id").IsEqual(@OrderId).And("ContractN", "AccountId").IsEqual("OrderN", "AccountId") as Select);

Guid TypePriceId = select.ExecuteScalar();
[/csharp]

По второму, надо без точки:
[csharp]
var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue("TypePriceId");
[/csharp]

Воспользовалась вариантом с Select-работает, выглядит проще и понятнее, как я поняла, при использовании Select не проверяются права
а это не получилось, тоже выскакивает ошибка
[csharp]
var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue("TypePriceId");
[/csharp]

Те же самые проблемы, то же самое решение через select, а вот про права интересный момент. Они точно через select не проверяются?

А зачем тут "="?
[csharp]
esq.AddColumn("=TypePrice.Id");
[/csharp]
Надо просто:
[csharp]
esq.AddColumn("TypePrice.Id");
[/csharp]

Хотела inner join Вот здесь подглядела http://www.community.terrasoft.ru/blogs/8978

Если колонка добавлялась подобным образом:

 esq.AddColumn("TypePrice.Id")

Значение нужно считывать следующим способом:

.GetTypedColumnValue<Guid>("TypePrice_Id")

Минусы такого способа добавления колонок - лишний JOIN к таблице, на которую ссылается колонка "TypePrice".

Оптимальный вариант:

Добавлять: esq.AddColumn("TypePrice")

Считывать: .GetTypedColumnValue<Guid>("TypePriceId")

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