2011-12-14 71 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