Фильтрация графа объектов каркаса сущностей - PullRequest
1 голос
/ 28 июля 2010

Я пытаюсь отфильтровать результаты, возвращаемые EF, только к тем, которые имеют отношение - в приведенном ниже примере к результатам за год (formattedYear) и типу заказа (filterOrder)

У меня есть простой наборобъекты

ЛЮДИ 1-М ЗАКАЗОВ 1-М ЗАКАЗЫ

с этими отношениями, уже определенными в Model.edmx

в SQL, я бы сделал что-то вроде ...

выберите * из ORDERS внутреннего присоединения PEOPLE в ORDERS.PEOPLE_RECNO = PEOPLE.RECORD_NUMBER внутреннего присоединения ORDERLINE в ORDERLINE.ORDER_RECNO = ORDERS.RECORD_NUMBER, где ORDERLINE.SERVICE_YEAR=@forDER1D1_1_1_1_1_1_011 и \ ormat_earfЯ попробовал пару подходов ...

        var y = _entities.PEOPLE.Include("ORDERS").Where("it.ORDERS.ORDER_KEY=" + filtOrder.ToString()).Include("ORDERLINEs").Where("it.ORDERS.ORDERLINEs.SERVICE_YEAR='" + formattedYear + "'");

        var x = (from hp in _entities.PEOPLE 
                 join ho in _entities.ORDERS on hp.RECORD_NUMBER equals ho.PEOPLE_RECNO
                 join ol in _entities.ORDERLINEs on ho.RECORD_NUMBER equals ol.ORDERS_RECNO
                 where (formattedYear == ol.SERVICE_YEAR) && (ho.ORDER_KEY==filtOrder)
                 select hp
                );

у не получается с ORDER_KEY не является членом transient.collection ... и x возвращает нужных людей, но к ним прикреплены все их заказы -не только те, за кем я иду.

Наверное, мне не хватает чего-то простого?

Ответы [ 2 ]

3 голосов
/ 28 июля 2010

Представьте, что у вас есть человек с 100 заказами. Теперь вы отфильтровываете эти заказы до 10. Наконец, вы выбираете человека, у которого есть эти заказы. Угадай, что? У человека еще 100 заказов!

То, что вы просите, это не сущность, потому что вам не нужна вся сущность. То, что вы, кажется, хотите, это подмножество данных от объекта. Итак, проект, который:

var x = from hp in _entities.PEOPLE
        let ho = hp.ORDERS.Where(o => o.ORDER_KEY == filtOrder
                                      && o.ORDERLINES.Any(ol => ol.SERVICE_YEAR == formattedYear))
        where ho.Any()
        select new 
        {
            Id = hp.ID,
            Name = hp.Name, // etc.
            Orders = from o in ho
                     select new { // whatever 
        };
1 голос
/ 02 марта 2011

Я не совсем уверен, что ваш вопрос, но может быть полезно следующее.

В структуре сущностей, если вы хотите загрузить граф объектов и отфильтровать дочерние объекты, вы можете сначала выполнить запрос для дочерних объектов и перечислить его (т. Е. Вызвать ToList ()), чтобы ребенок выбирался из памяти.

И затем, когда вы извлекаете родительские объекты (и не используете .include), инфраструктура enitity сможет построить график самостоятельно (но учтите, что вам, возможно, придется сначала отключить отложенную загрузку, иначе загрузка займет много времени). Вот пример (если ваш контекст "db"):

db.ContextOptions.LazyLoadingEnabled = false;

var childQuery = (from o in db.orders.Take(10) select o).ToList();

var q = (from p in db.people select p).ToList();


Теперь вы обнаружите, что у каждого объекта людей есть десять объектов порядка.


РЕДАКТИРОВАТЬ: я спешил, когда писал пример кода, и поэтому я еще не тестировал его, и я, вероятно, ошибся, заявив, что .Take (10) будет возвращать десять заказов для каждого объекта people, вместо этого я считаю, что .Take (10) вернет только десять общих заказов, когда отложенная загрузка отключена, (а для случая, когда отложенная загрузка включена, мне нужно фактически проверить, каков будет результат), и чтобы вернуть десять Приказы для каждого объекта люди, возможно, придется выполнить более обширную фильтрацию.

Но идея проста: вы сначала выбираете все дочерние объекты, а структура сущностей строит граф самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...