Вопрос

фильтр с подзапросом в EntitySchemaQuery

Добрый день!

Подскажите, как средствами серверной 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 комментариев
Лучший ответ

Максим.Паламарчук,
Попробуйте такой вариант

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

 

Через 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);

 

Сидоров Александр В.,

насчет Select я согласен, а вот в esq, мне кажется, что колонка Type относится к схеме Order, а не OrderProduct, или я не прав?

Максим.Паламарчук, 
Да, согласен. Нужно Type внести во внутренний запрос

Сидоров Александр В.,

А каким образом это реализовать?

Максим.Паламарчук,
Попробуйте такой вариант

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

 

Сидоров Александр В.,

спасибо, все работает. Свойство IsNot как раз то, что нужно

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