Разбираюсь с 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))
И разница в стоимости почти в два раза.
Вопрос: можно написать проще?
Нравится
Ещё проблемка возникла, начинаю читать значение,
[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")