Вложенный запрос/коллекция свойств навигации

Предположим, что используются следующие модели: (пример взят из Breeze DocCode)

public class Customer {

    public Guid CustomerID { get; internal set; }
    public ICollection<Order> Orders { get; set; }
}

public class SomeDetail{
    public string name{ get; set; }
}

public class Order {

    public int OrderID {get; set;}
    public Guid? CustomerID {get; set;}

    public SomeDetail detail {get; set;}
}

Вложенные запросы к отдельным свойствам навигации мне понятны. Как это можно сделать, если свойство навигации является коллекцией? Что-то вроде этого:

var query = EntityQuery.from("Customers")
                 .where("Orders.detail.name", "==", someName);

Как «Текст»: выберите всех клиентов, где имя детали любого заказа этого клиента равно некоторому состоянию?

Я сталкиваюсь с ошибками здесь, потому что

.where("Orders.detail.name, "=", someCondition)

невозможно из-за коллекции. Есть ли короткий способ проверить эти условия без создания количества коллекций и фильтрации для каждой руки?

Любая помощь очень ценится здесь.


person Sascha Herrmann    schedule 30.11.2012    source источник
comment
Да... пока нельзя. Я предполагаю, что вы имеете в виду «Дайте мне каждого клиента, у которого есть заказ», с деталью, имя которой «someName». Такой запрос потребует двух предложений Any. Сегодняшняя спецификация OData не поддерживает это. Мы работаем над этим. На самом деле у меня есть способ сделать этот запрос, если вам нужно только ответить на этот вопрос. Он включает в себя пользовательский метод запроса на контроллере. Вы не можете написать фильтр на стороне клиента или расширить его. Все, что вы можете сделать, это передать такие параметры, как 'someName'. Дайте мне знать, если вы этого хотите. Между тем, в нашем бэклоге есть запрос на упрощение/возможность такого рода вещей.   -  person Ward    schedule 01.12.2012
comment
Я бы тоже очень хотел увидеть это. Это очень помогло бы мне упростить вещи.   -  person Sascha Herrmann    schedule 01.12.2012
comment
Это еще не то, чего я хочу, и я не готов много говорить об этом, но я отправил на github тест DocCode в queryTests.js под названием заказы для Chai. Соответствующий NorthwindController метод — OrdersForProduct. Используйте его для вдохновения. Мы сделаем намного лучше.   -  person Ward    schedule 01.12.2012


Ответы (1)


Начиная с Breeze 1.4.6, мы добавили поддержку двух новых операторов запросов: «любой» и «все».

Это означает, что теперь ваш запрос может выглядеть примерно так.

var query = EntityQuery.from("Customers")
   .where("Orders", "any", "detail.name", "==", someName);

См.: http://www.breezejs.com/documentation/query-examples.

person Jay Traband    schedule 26.11.2013
comment
В этом случае Query не возвращает только клиентов с Orders.Detail.name == somename, если условие удовлетворяет любому из них, он возвращает соответствие, а также другие записи, верно? - person Pavan; 03.09.2014
comment
Этот запрос возвращает ВСЕХ клиентов, у которых есть ЛЮБЫЕ заказы с 'detail.name' равным {someName}. - person Jay Traband; 03.09.2014
comment
Спасибо Джей за ответ. У меня есть еще один вопрос. когда я запрашиваю, как указано выше, я нахожу, что в наборе результатов также есть записи с «detail.name», отличным от некоторого имени. Означает Условие, которое удовлетворяет, а также не удовлетворяет, и в последнем случае Orders obj имеет значение null. Разве мы не можем фильтровать как родительский класс, так и дочерний класс, поскольку мы делаем соединения в запросе sql? - person Pavan; 04.09.2014