以下的描述都是同一个DataContext
1.通过提前检索数据提高循环查询的性能
原因:如果数据已经在DataContext中加载过,使用外键关系的对象将不会访问数据。
var db = App.DB; db.Log = Console.Out; db.GetTable<HR_Employee>().ToArray(); var list = db.GetTable<HR_PayEmployee>().Take(20).ToList(); foreach (var item in list) { var a = item.HR_Employee; }
如果将红色部分注释掉,紫色部分的代码,每执行一次将访问一边数据库。
2.通过LoadWith加载子表信息(具体参看MSDN)。
var db = App.DB; db.Log = Console.Out; DataLoadOptions options = new DataLoadOptions(); options.LoadWith<HR_PayEmployee>(p => p.HR_PayRecord); db.LoadOptions = options; //db.GetTable<HR_PayRecord>().ToList(); //var list = db.GetTable<HR_PayEmployee>().Take(3).ToList(); var list = db.GetTable<HR_PayEmployee>().ToList(); foreach (var item in list) { var a = item.HR_PayRecord[0].Amount; }
不用LoadWith:不论是否执行加载红色部分的对象,紫色部分每次循环都会访问数据库。
用了LoadWith:紫色部分每次循环都不会访问数据库。
注意:如果第一次访问是通过 db.GetTable<HR_PayEmployee>().Take(3).ToList()进行访问,则不论是否LoadWith都会访问数据库,如果提前通过其他方式ToList过,则再次使用Take后对子对象的访问将不会访问数据。
如果LoadWith中写入过多的对象,将大大降低性能,所以需要根据情况选择不用的加载方式来提高Linq的查询性能。