Linq to entities 使用LINQtoEntity框架运行查询以返回大层次结构

Linq to entities 使用LINQtoEntity框架运行查询以返回大层次结构,linq-to-entities,Linq To Entities,关于林克,我不得不问的第二个问题!所以我承认我刚刚开始使用它,而且我对它有点了解。但我的最后一个问题得到了很好的答案,所以我想我会再次碰碰运气的!我已经为此奋斗了一天了 我有一个很长的层次结构,我希望返回所有的层次结构,但是在层次结构的末尾,我需要它是有条件的 我有这样的层次结构: Person (object) -> Party (object) -> Workers (collection) -> WorkerOperatorAssignment (collection)

关于林克,我不得不问的第二个问题!所以我承认我刚刚开始使用它,而且我对它有点了解。但我的最后一个问题得到了很好的答案,所以我想我会再次碰碰运气的!我已经为此奋斗了一天了

我有一个很长的层次结构,我希望返回所有的层次结构,但是在层次结构的末尾,我需要它是有条件的

我有这样的层次结构:

Person (object) -> Party (object) -> Workers (collection) 
-> WorkerOperatorAssignment (collection) -> Operator (object)
-> OperatorBusinessAssignment (collection) -> BusinessUnit (object)
这是通过操作员表从一个人到一个业务单位,因为我需要确保操作员行是针对该人员的,并且直接到该业务单位,因为我需要确保操作员也被分配到一个业务单位,但是从一个人到业务单位的路线也较短(仅供参考)

第一张桌子上有PersonID,最后一张桌子上有BusinessUnitID。我基本上需要返回一个Person对象,该对象包含层次结构的每个部分,以及特定业务单元中的所有操作员记录

到目前为止,我已经有了这段Linq,它会一直返回到操作符,但会返回查询中的所有操作符,而不仅仅是那些与某个业务单元有某种关联的操作符。这是因为无法在Include语句中放入where子句

var PersonQuery = 
    DbContext.People.Where(p => p.PersonPartyID == personPartyID)
    .Include(p => p.Party.Workers.Select(w => w.WorkerOperatorAssignments.Select(a => a.Operator)));
我已经关闭了延迟加载,如果可能的话,我需要在一个查询中完成

我如何限制返回的操作员,使其只返回业务单元中的操作员

更新:

根据内森的回答,我回到了最初的问题并完成了它。它已成为一个复杂的查询

(from P in DbContext.People
 where P.PersonPartyID == personPartyID
 select new
 {
   PersonObject = P,
   PartyObject = P.Party,
   WorkerObject = P.Party.Workers.FirstOrDefault(),
   BusinessUnit = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID).FirstOrDefault(),
   WorkerOperatorAssignments = P.Party.Workers.SelectMany(w => w.WorkerOperatorAssignments)
                                             .Where(a => a.Operator.OperatorBusinessUnitAssignments.Any(oa => oa.BusinessUnit.BusinessUnitID == businessUnitID)),
   Operator = P.BusinessUnits.Where(bu => bu.BusinessUnitID == businessUnitID)
                             .SelectMany(bu => bu.OperatorBusinessUnitAssignments)
                             .Select(a => a.Operator)
 }).SingleOrDefault();
现在的问题是,幕后实体框架似乎自动将每个对象附加到Person对象上,业务单元除外

所以在这个查询之后,我需要这样做:

// get the person object
if (PersonQuery != null)
{
    // get the person object
    Person ReturnObject = PersonQuery.PersonObject;

    // now attach the business unit
    ReturnObject.BusinessUnits.Add(PersonQuery.BusinessUnit);
 }
 else
 {
    return null;
 }
我的查询有什么问题,我需要这样做吗?

这应该可以帮助您:
你也可以看看CreateSourceQuery,如果这并不能解决你的问题。

起初我研究了这个问题,但是查询变得复杂了,所以我希望有一个更简单的方法,我正在用新的查询更新我的问题。
// get the person object
if (PersonQuery != null)
{
    // get the person object
    Person ReturnObject = PersonQuery.PersonObject;

    // now attach the business unit
    ReturnObject.BusinessUnits.Add(PersonQuery.BusinessUnit);
 }
 else
 {
    return null;
 }