这一篇文章主要总结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方法。
运行结果与内联接相同。