Добрый день!
Подскажите, как средствами серверной ESQ реализовать такой запрос
select o.Number
from [Order] o
where not exists(
select null
from OrderProduct op
where op.OrderId = o.Id
and op.TypeId = '29468170-1C73-4851-967B-90E5C108AEF9' --some type
)Не получается задать связь op.OrderId = o.Id в подзапросе.
Нравится
6 комментариев
Лучший ответ
20 марта 2019 17:35
Максим.Паламарчук,
Попробуйте такой вариант
var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
esq.AddAllSchemaColumns();
var filtersByExisting = new EntitySchemaQueryFilterCollection(esq);
filtersByExisting.IsNot = true;
var notExFilter = esq.CreateFilterWithParameters(
FilterComparisonType.IsNotNull,
"[OrderProduct:Order].Id");
filtersByExisting.Add(notExFilter);
filtersByExisting.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"[OrderProduct:Order].Type.Id", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
esq.Filters.Add(filtersByExisting);
var entityCollection = esq.GetEntityCollection(_userConnection);
20 марта 2019 16:59
Через Select:
var select = new Select(_userConnection)
.Column("o", "Number")
.From("Order").As("o")
.Where()
.Not().Exists(
new Select(_userConnection).Column("op", "Id").From("OrderProduct").As("op").Where("op", "OrderId ").IsEqual("o", "Id")
.And("op", "TypeId").IsEqual(Column.Parameter("29468170-1C73-4851-967B-90E5C108AEF9"))
);Через ESQ:
var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
esq.AddAllSchemaColumns();
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal, "Type", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
esq.Filters.Add(esq.CreateFilterWithParameters(FilterComparisonType.NotExists, "[OrderProduct:Order:Id].Id"));
var entityCollection = esq.GetEntityCollection(_userConnection);
20 марта 2019 17:15
Сидоров Александр В.,
насчет Select я согласен, а вот в esq, мне кажется, что колонка Type относится к схеме Order, а не OrderProduct, или я не прав?
20 марта 2019 17:22
Максим.Паламарчук,
Да, согласен. Нужно Type внести во внутренний запрос
20 марта 2019 17:24
Сидоров Александр В.,
А каким образом это реализовать?
20 марта 2019 17:35
Максим.Паламарчук,
Попробуйте такой вариант
var esq = new EntitySchemaQuery(_userConnection.EntitySchemaManager, "Order");
esq.AddAllSchemaColumns();
var filtersByExisting = new EntitySchemaQueryFilterCollection(esq);
filtersByExisting.IsNot = true;
var notExFilter = esq.CreateFilterWithParameters(
FilterComparisonType.IsNotNull,
"[OrderProduct:Order].Id");
filtersByExisting.Add(notExFilter);
filtersByExisting.Add(esq.CreateFilterWithParameters(FilterComparisonType.Equal,
"[OrderProduct:Order].Type.Id", new Guid("29468170-1C73-4851-967B-90E5C108AEF9")));
esq.Filters.Add(filtersByExisting);
var entityCollection = esq.GetEntityCollection(_userConnection);
20 марта 2019 17:49
Сидоров Александр В.,
спасибо, все работает. Свойство IsNot как раз то, что нужно
Показать все комментарии
Войдите или зарегистрируйтесь, что бы комментировать