2011-12-14 53 views
0

很新的LINQ的,和我与这一个挣扎。基本上我有一个“工人”的集合,每个对象本身都包含一个“WorkerOperatorAssignments”集合,每个对象都包含一个“运算符”对象。使用LINQ to对象,以得到一个对象深层次

工人(集合) - > WorkerOperatorAssignments(集合) - > 操作(对象)

我想返回在使用LINQ某些情况下,操作员记录。我见到目前为止如下:

Operator TillLogin = WorkersCollection.Where(w => 
    w.WorkerOperatorAssignments.Any(a => 
     a.Operator.TypeCode == OperatorTypeCode.TillOperator) 
); 

但这显然返回一个包含操作记录按照where子句工人的集合。在这种情况下,我该如何返回实际的操作员记录?

更新:

谢谢大家的答案,帮了我一大堆。我已经修改了我的全部查询:

Operator TillLogin = Response.Payload.Party.Workers 
     .SelectMany(w => w.WorkerOperatorAssignments) 
     .Select(a => a.Operator) 
     .Where(o => o.TypeCode.Trim() == OperatorTypeCode.TillOperator) 
     .SingleOrDefault(); 

回答

2

您可以使用该的SelectMany得到WorkerOperatorAssignments ...然后在操作员使用选择。然后,你可以过滤的运营商:

IEnumerable<Operator> tillOperators = 

// flatten the WorkerOperatorAssignments 
WorkersCollection.SelectMany(w => w.WorkerOperatorAssignments) 
    // get the Operator off each WorkerOperatorAssignment 
    .Select(a => a.Operator) 
    // filter the Operators 
    .Where(o => o.TypeCode == OperatorTypeCode.TillOperator)); 
+0

绝对的天才,你救了我的理智!非常感谢。我会将此标记为答案,因为我相信你是第一个答案。尽管所有其他答案也很好。 – eyeballpaul 2011-12-14 16:19:47

2
var operators = 
    from worker in WorkersCollection 
    from workerAssignment in worker.WorkerOperatorAssignments 
    where workerAssignment.Operator.TypeCode == OperatorTypeCode.TillOperator 
    select workerAssignment.Operator; 
+0

谢谢您的回答,您都在这里帮 – eyeballpaul 2011-12-14 16:20:34

2

这听起来像你想:

var tills = from worker in WorkersCollection 
      from assignment in worker.WorkerOperatorAssignments 
      where assignment.Operator.TypeCode == OperatorTypeCode.TillOperator 
      select assignment.Operator; 

var firstTillLogin = tills.First(); // Or whatever... 

注的最后一部分,从所有匹配运营商的只是一个顺序去第一个。您可能需要首先,FirstOrDefaultLastLastOrDefaultSingle,或SingleOrDefault - 或者你只是想处理所有的人。我们无法确定。

+0

谢谢你的回答,你都在这里帮 – eyeballpaul 2011-12-14 16:20:27

1
Operator TillLogin = WorkersCollection 
    .SelectMany(w => w.WorkerOperatorAssignments) //get all the worker assignments 
    .Select(oa => oa.Operator) //from each select the operator 
    .Single(o => o.TypeCode == OperatorTypeCode.TillOperator); //find the single operator that matches the code 

如果没有使用该类型代码的单个运算符,则会引发异常。如果你不想抛出一个异常,而是有TillLoginnull,使用SingleOrDefault(假设运营商是不是值类型,否则这将是默认值)。

+0

谢谢你的回答,你都在这里帮助 – eyeballpaul 2011-12-14 16:20:18