Разбираюсь с ESQ, прямо скажу въехала не до конца ))
Есть простой запрос на T-SQL
FROM ContractN a
WHERE EXISTS (
SELECT b.Id
FROM OrderN b
WHERE b.Id = @OrderId AND a.AccountId=b.AccountId
)
Возвращает единичный результат
Наваяла следующее
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);
Возвращает идентичный результат, но естественно разница в коде
[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))
И разница в стоимости почти в два раза.
Вопрос: можно написать проще?
Нравится
Ещё проблемка возникла, начинаю читать значение,
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")