HOW TO:在執行階段動態指定述詞篩選條件 (C# 程式設計手冊)
在某些情況下,在執行階段之前您不知道必須將多少述詞套用至 where 子句中的來源項目。動態指定多個述詞篩選條件的一個方法是使用 Contains 方法,如下列範例所示。本範例是以兩種方式建構:首先,藉由篩選程式中提供的值來執行專案。接著,使用在執行階段提供的輸入再次執行專案。
若要使用 Contains 方法進行篩選
在 Visual Studio 中開啟新的主控台應用程式。將它命名為 PredicateFilters。
複製 HOW TO:查詢物件集合 (C# 程式設計手冊)中的 StudentClass 類別並將它複製到 Program 類別之下的 PredicateFilters 命名空間中。StudentClass 會提供 Student 物件清單。
將 StudentClass 中的 Main 方法標記為註解。
將 Program 類別替換成下列程式碼。
class DynamicPredicates : StudentClass { static void Main(string[] args) { string[] ids = { "111", "114", "112" }; Console.WriteLine("Press any key to exit."); Console.ReadKey(); } static void QueryByID(string[] ids) { var queryNames = from student in students let i = student.ID.ToString() where ids.Contains(i) select new { student.LastName, student.ID }; foreach (var name in queryNames) { Console.WriteLine("{0}: {1}", name.LastName, name.ID); } } }
在 ids 的宣告之下,將下列程式碼行加入至 DynamicPredicates 類別中的 Main 方法。
QueryById(ids);
按 F5 執行專案。
下列輸出會顯示在 [命令提示字元] 視窗中:
Garcia: 114
O'Donnell: 112
Omelchenko: 111
下一個步驟是再次執行專案,這一次請藉由使用在執行階段提供的輸入而非 ids 陣列。在 [方案總管] 中,以滑鼠右鍵按一下 [PredicateFilters],然後按一下 [屬性]。
按一下 [偵錯] 索引標籤。
在 [命令列引數] 視窗中,輸入 122、117、120 和 115 並以空白字元分隔:122 117 120 115。執行專案時,這些值會變成 args 的項目、Main 方法的參數。
在 Main 方法中,將 QueryByID(ids) 變更為 QueryByID(args)。
按 F5 執行專案。
下列輸出會顯示在 [命令提示字元] 視窗中:
Adams: 120
Feng: 117
Garcia: 115
Tucker: 122
若要使用 switch 陳述式進行篩選
您可以使用 switch 陳述式,在預先決定的替代查詢中進行選取。在下列範例中,根據在執行階段指定的年級,studentQuery 會使用不同的 where 子句。
複製下列方法並將它貼入至 DynamicPredicates 類別中。
// To run this sample, first specify an integer value of 1 to 4 for the command // line. This number will be converted to a GradeLevel value that specifies which // set of students to query. // Call the method: QueryByYear(args[0]); static void QueryByYear(string level) { GradeLevel year = (GradeLevel)Convert.ToInt32(level); IEnumerable<Student> studentQuery = null; switch (year) { case GradeLevel.FirstYear: studentQuery = from student in students where student.Year == GradeLevel.FirstYear select student; break; case GradeLevel.SecondYear: studentQuery = from student in students where student.Year == GradeLevel.SecondYear select student; break; case GradeLevel.ThirdYear: studentQuery = from student in students where student.Year == GradeLevel.ThirdYear select student; break; case GradeLevel.FourthYear: studentQuery = from student in students where student.Year == GradeLevel.FourthYear select student; break; default: break; } Console.WriteLine("The following students are at level {0}", year.ToString()); foreach (Student name in studentQuery) { Console.WriteLine("{0}: {1}", name.LastName, name.ID); } }
在 [命令列引數] 視窗中,使用介於 1 和 4 之間的整數值取代上一個程序中的 ID 編號。
在 Main 方法中,使用下列呼叫取代對 QueryByID 的呼叫,以傳送 args 陣列中的第一個項目做為其引數:QueryByYear(args[0])。
按 F5 執行專案。
若要在自己的應用程式中使用這個方法
- 在配合自己的應用程式調整這個方法時,請記得 LINQ 需要 3.5 或 4 版的 .NET Framework,而且專案必須包含 System.Core.dll 的參考以及 System.Linq 的 using 指示詞。LINQ to SQL、LINQ to XML 和 LINQ to DataSet 型別都需要額外的 using 指示詞和參考。如需詳細資訊,請參閱 HOW TO:建立 LINQ 專案。