這一篇文章主要總結LINQ to sql的簡單查詢(單表查詢)和聯接查詢(多表查詢)
單表查詢
需求是我們要輸出TClass表中的結果。使用了from…in…select語句,代碼如下:
public static void SimpleQuery() { using (L2SDBDataContext db = new L2SDBDataContext()) { var query = from tc in db.TClasses //select tc; select new { ClassID=tc.ClassID, ClassName=tc.ClassName }; Console.WriteLine("output results for table of class"); int i = 1; foreach (var item in query) { Console.WriteLine("{0},ClassID:{1},ClassName:{2}",i,item.ClassID,item.ClassName); i++; } } }
注意:這里沒有用select tc,而是定義了一個新的匿名類型是因為性能的考慮,后面性能優化的部分會講到。
輸出結果:
多表查詢
多表查詢,也可以稱為聯接查詢,需要通過外鍵聯接多張表才能查詢到我們想要的結果,現在的需求是某個班級及這個班級相關學生的信息。實現這個需求有兩種方法,一種是內聯接,另一種方法是外聯接,下面是通過內聯接查詢的代碼。
public static void Query_InnerJoin() { using (L2SDBDataContext db = new L2SDBDataContext()) { var query = from s in db.TStudents join c in db.TClasses on s.ClassID equals c.ClassID where s.ClassID == 3 select new { ClassID = s.ClassID, ClassName = c.ClassName, Student = new { Name = s.Name, StudentID = s.StudentID } }; foreach (var item in query) { Console.WriteLine("{0} {1} {2}", item.ClassID, item.ClassName, item.Student.Name); } } }
運行結果:
外聯接代碼:
public static void Query_OutJoin() { using (L2SDBDataContext db = new L2SDBDataContext()) { var query = from s in db.TStudents join c in db.TClasses on s.ClassID equals c.ClassID into gc from gci in gc.DefaultIfEmpty() where s.ClassID == 3 select new { ClassID = s.ClassID, ClassName = gci.ClassName, Student = new { Name = s.Name, StudentID = s.StudentID } }; foreach (var item in query) { Console.WriteLine("{0}, {1} [{2}]", item.ClassID, item.ClassName, item.Student.Name); } } }
注意:outer join時必須將join后的表into到一個新的變量中,然后調用這個對象的DefaultIfEmpty方法。
運行結果與內聯接相同。