EF 4 Filter sub collection - PullRequest
       1

EF 4 Filter sub collection

0 голосов
/ 09 февраля 2011

Я пытаюсь собрать все свои группы с соответствующими объектами. И я также хотел бы отфильтровать коллекцию BuildingPartData, не затрагивая другие объекты. Я в значительной степени перепробовал все, что мог придумать, но безуспешно.

 test.ContextOptions.LazyLoadingEnabled = false;

        var buildingPartMainGroups = (from buildingPartMainGroup in test.BuildingPartMainGroup
                                      from buildingPartSubGroup in buildingPartMainGroup.BuildingPartSubGroup
                                      from buildingPart in buildingPartSubGroup.BuildingPart
                                      from buildingPartData in buildingPart.BuildingPartData
                                      where buildingPartData.StatusPendingApprove == true
                                      //let buildingPartData = buildingPartMainGroup.BuildingPartSubGroup.Where(x => x.BuildingPart.Any(o => o.BuildingPartData.Any(y => y.StatusPendingApprove == true)))
                             select new
                             {
                                 BuildingPartMainGroups = buildingPartMainGroup,
                                 BuildingPartDatas = buildingPartData

                             }).ToList().Select(c => c.BuildingPartMainGroups);

        foreach (var bb in buildingPartMainGroups)
        {
            foreach(var tt in bb.BuildingPartSubGroup)
            {
                foreach (var oo in tt.BuildingPart)
                {
                    foreach (var ww in oo.BuildingPartData)
                    {
                        bool tes4t = ww.StatusPendingApprove;
                    }
                }
            }
        }

Вот модель

http://mimo -design.com / model.png

Не могу вставить изображения еще ..

var buildingPartMainGroups = test.BuildingPartMainGroup.Include("BuildingPartSubGroup.BuildingPart.BuildingPartData").
                                        Where(bpmg => bpmg.BuildingPartSubGroup.
                                            Any(o => o.BuildingPart.
                                                Any(x => x.BuildingPartData.
                                                    Any(u => u.StatusPendingApprove == true))));

Это только отфильтровало мою сущность BuildingPartMainGroup. Я хотел бы иметь все мои объекты BuildingPartMainGroup с условием / фильтром для BuildingPartData

Ответы [ 2 ]

0 голосов
/ 09 февраля 2011

Вы не должны использовать Any.Любое вычисляется как логическое.Итак, что вы на самом деле делаете, это собираете BuildingPartMainGroup, у которого есть минимум 1 BuildingPartSubGroup, у которого есть минимум 1 ..., у которого есть минимум одна BuildingPartData, у которой есть StatusPendingApprove == true.

Попробуйте рассмотреть цепочкуМетод расширения <> () на всем пути вниз по графу объектов.

Надеюсь, это поможет ...

РЕДАКТИРОВАТЬ:

context.BuildingPartMainGroups
    .Inlcude("BuildingPartSubGroups.BuildingParts.BuildingPartData")
    .Where<BuildingPartMainGroup>
    (bpmg => bpmg.BuildingPartSubGroups.Where<BuildingPartSubGroup>
    (bpsg => bpsg.BuildingParts.Where<BuildingPart>
    (bp => bp.BuildingPartData"s".Where<BuildingPartData>
    (bpd => bpd.StatusPendingApprove == true))))

Интересно, нужно ли включатьПрямо здесь.Если вы заинтересованы исключительно в BuidlingPartMainGroups без связанных данных, в этом нет необходимости.

Полезным советом может быть использование SQl Profiler для просмотра точного запроса SQL, который генерирует EF.таким образом вы получите больше понимания того, что ваш запрос LinqToEntities генерирует для SQL.

0 голосов
/ 09 февраля 2011

Вы уже подумали о чем-то вроде:

context.BuildingPartMainGroup
 .Inlcude("BuildingPartSubGroups.BuildingParts.BuildingPartData")
 .Where<BuildingPartMainGroup>(bpmg => bpmg.BuildingPartSubGroups.Any<BuildingPartSubGroup>(etc...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...