2012-01-13 55 views
2

我希望使用LINQ查詢來獲得電話號碼爲「666666」的員工。更深層次的lambda表達式中的LINQ查詢

這些類定義:

public class Employees 
{ 
    public List<Phones> Phones{get;set} 
} 
public class Phones 
{ 
    public string Id{get;set;} 
    public string Number{get;set;} 
} 

這是我的查詢(我的疑問表示爲???):

var employees= data.GetEmployees() 
        .Where(e=> e.Phones ???i need to navigate a level below phones ???) 
        .Select(e => new Employee() 
        {  
         Id=e.Id, 
         Name=e.Name 
        }); 

我的問題是我不知道如何在這個LINQ表達式中更深層次的,因爲在e=>e...我有權訪問Phones作爲IEnumerable,但我想導航到Phone'的屬性。

+1

你們是不是要叫魔鬼? ;) – 2012-01-13 16:50:49

回答

3

最簡單的方法是使用嵌套的LINQ查詢。在這種情況下,您應該查看Any方法。

var employees= data 
    .GetEmployees() 
    .Where(e => e.Phones.Any(p => p.Number == "666666")) 
    .Select(e => new Employee() { 
    Id = e.Id, 
    Name = e.Name 
    }); 
+0

非常感謝。 10分鐘後的最佳答案:-)) – Jose3d 2012-01-13 16:51:56

3

傳遞給where方法的參數僅僅是對每個給定元素返回true或false的函數,所有方法(包括LINQ的函數(受訪問ref/out參數等))仍然可以在其中調用:

var employees= data.GetEmployees() 
       .Where(e => e.Phones.Any(p => p.Number == "666666")) 
       .Select(e => new Employee() 
       {  
        Id=e.Id, 
        Name=e.Name 
       }); 
+0

非常感謝它的工作 – Jose3d 2012-01-13 16:52:28

1
var employees= data.GetEmployees() 
       .Where(e=> e.Phones.Contains(x=>x.Number == "666666")) 
       .Select(e => new Employee() 
       {  
        Id=e.Id, 
        Name=e.Name 
       });