對於實現了IEnumerable<T>接口的類、類型、集合可以使用Linq、Linq的擴展方法where()、FindAll()來查詢符合謂詞約束的數據。這三者之間執行的方式是不一樣的,同樣的數據同樣的查詢條件返回的結果也不相同。先上代碼再分析。
-
public static void LaterSelect()
-
{
-
var names = new List<string> { "Nino", "Alberto", "Juan", "Mike", "Phil" };
-
-
var namesWithJ = from n in names
-
where n.StartsWith("J")
-
orderby n
-
select n;
-
var namesWithJforWhere = names.Where<string>(n => n.StartsWith("J"));
-
var namesWithJforFindAll = names.FindAll(n => n.StartsWith("J"));
-
Console.WriteLine( "First iteration by Linq:");
-
foreach (string name in namesWithJ)
-
{
-
Console.WriteLine(name);
-
}
-
-
Console.WriteLine( "First iteration by names.Where():");
-
foreach (var name in namesWithJforWhere)
-
{
-
Console.WriteLine(name);
-
}
-
Console.WriteLine( "First iteration by names.FindAll():");
-
foreach (var name in namesWithJforFindAll)
-
{
-
Console.WriteLine(name);
-
}
-
-
-
Console.WriteLine();
-
-
names.Add( "John");
-
names.Add( "Jim");
-
names.Add( "Jack");
-
names.Add( "Denny");
-
Console.WriteLine( "Second iteration by Linq:");
-
foreach (string name in namesWithJ)
-
{
-
Console.WriteLine(name);
-
}
-
Console.WriteLine( "Second iteration by names.Where():");
-
foreach (var name in namesWithJforWhere)
-
{
-
Console.WriteLine(name);
-
}
-
Console.WriteLine( "Second iteration by names.FindAll():");
-
foreach (var name in namesWithJforFindAll)
-
{
-
Console.WriteLine(name);
-
}
-
}
輸出結果:

分析:
從輸出結果可以看出,Linq和where兩種方式的結果是相同的,說明這兩者之間沒有區別,當定義一個查詢后並沒有立即執行查詢而是在執行foreach循環的時候才執行查詢而且是在每一次執行foreach循環的時候去執行查詢,這樣只要數據是變化的結果就會是變化的。但是在一些情況下,這是不可行的。調用擴展方法 ToArray()、ToEnumerable()、ToList()等可以改變這個操作,使返回的結果始終一致,這里是在調用To*這些方法時執行了一次查詢而且不是延遲查詢。FindAll()方法和Linq、where是有區別的,FindAll()不是延遲加載或者說延遲查詢,當定義一個查詢后就立即查詢出所有符合條件的數據保存在變量中。
