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