日期:2014-05-20  浏览次数:20749 次

LinQ的orderby问题
开发环境:EF4.1+MVC3
问题:在controller中,使用orderby的时候iis进程特别吃内存,这是什么原因,哪位大神能给解读一下,谢谢!
代码如下: sitInformationList = sitInformation.AsEnumerable().OrderByDescending(sri => sri.GetType().GetProperty(sidx).GetValue(sri, null))
                                         .Skip(rowNum * (page - 1)).Take(rowNum).ToList();

------解决方案--------------------
不是 orderby 的问题,是你的 AsEnumerable()的问题。
当使用AsEnumerable()时,linq 的Provider已经改变,这时应该是linq to object,而非linq to ef.
后面的排序,分页都是在内存中,非数据库。
先从数据库把数据全部拿到内存里再进行排序分页,sitInformation的数据大的话,占内存。
------解决方案--------------------
var p = Expression.Parameter(sri.GetType(), "p");
var body = Expression.MakeMemberAccess(sri.GetType().GetProperty(sidx), p);
var orderbylambda = Expression.Lambda(p, body);
sitInformationList = sitInformation.OrderByDescending(orderbylambda);