Работа с 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 комментариев

Ещё проблемка возникла, начинаю читать значение,

var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue<Guid>("TypePrice.Id");

вылезает следующее исключение:

Значение с именем "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.

Ваш запрос будет примерно (не запускал, возможны ошибки):

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<Guid>();

По второму, надо без точки:

var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue<Guid>("TypePriceId");

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

var tpidEntities = esq.GetEntityCollection(UserConnection);
Guid TypePriceId = tpidEntities[0].GetTypedColumnValue<Guid>("TypePriceId");

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

А зачем тут "="?

esq.AddColumn("=TypePrice.Id");

Надо просто:

esq.AddColumn("TypePrice.Id");

Хотела 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")

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