我编写了一个自定义比较器,用于对字符串和数字进行排序。一切正常。
然而,我正在重写我的整个BLL以尽可能使用LINQ,因为我喜欢语法。现在我磕磕绊绊地使用我的自定义比较器。由于LINQ语法(基于查询)不允许使用自定义比较器,我现在使用基于方法的LINQ。
但是为了使它工作,我需要做一个中间ToList(),它再次正常工作,但看起来有些奇怪吗?
var areas = cc.Areas.Where(a => a.ProjectId == ProjectId).ToList()
.OrderBy(a => a.UnitNumber, new Common.Comparers.StringNumericComparer());
现在我不确定这是否与首先执行的SQL查询有关,然后结果在我的C#代码端排序,但这是我所不知道的。 ToList()是否强制在数据库上执行linq查询的第一部分?
答案 0 :(得分:3)
是的,.ToList()
强制您加载Areas
并在内存中进行排序。
答案 1 :(得分:3)
是的,你的理解是正确的。直到.ToList()它才是IQueryable。在ToList()上,将触发数据库查询,并在内存中获取结果,然后在List上进行排序。
您的比较器在此之前无法执行,因为它不会转换为SQL查询。