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

linq 查询Where 问题
各位帮小弟看个问题 

比如说 对于一个User表 有两个页面 一个是查看全部User 信息 一个是查看 被屏蔽的User 信息

那么 查询的时候 我们是否可以这样 
public IEnumerable getAllUser(){
 var item  = from u in db.User select new UserInfo(这是自建的模型类){
   name=u.name,
   id=u.id,
 }
return item;
}
比如查询全部用户的时候是可以这么写

那么查询是否屏蔽的用户 其实说白了 就加个where u.isStop(屏蔽字段 比如说是bool类型) 那么

我们是否 可以这样 调用上面的
public IEnumerable getStopUser(){
  var item=GetAllUser().where<UserInfo>(x=>x.isStop==true);
  return item;

理论上 这么些就ok了 但是这里有个问题 不明白 如果说 先调用getAllUser的时候是查询全部的User 然后

再用where 语句筛选出是否是屏蔽用户 这样做的话 有多余的查询 先查询在筛选 随着用户的不断增长 那么数据

变成 几千条的时候 肯定会有延迟 是吧 那我就问了 大伙一般解决这样的问题是怎么弄的 是否在getStopUser

方法里重新写跟上面GetAllUser一样的Linq语句 然后再加上一个Where 还是用其他的方法 小弟跪求 在线等
Linq?查询

------解决方案--------------------
1.如果真的遇到performance问题,我会选择stored proc.
2.通过你的第一句话,有2个页面,弱弱的问一句:几千个用户需要分页吗?
3.如果真要load isStop所有的,那么筛选应该建立在 第一次查询后放在内存里的users.

PS : 
GetAllUser().where<UserInfo>(x=>x.isStop==true);
改为GetAllUser().where<UserInfo>(x=>x.isStop); 
略微优雅些

------解决方案--------------------
getAllUser返回IQueryable<T> 
这样可以做到延迟查询 如果你再加在上where 它会自动生成最优的sql语句的
------解决方案--------------------
不行。
转成UserInfo以后就不是Entity了,无法再用IQuery<TEntity>查询,这意味着你的Where过滤是在内存中执行,而数据库查询会查出全部数据。

所以你不能转成UserInfo,要保留原来的entity类型:
var item  = from u in db.User select u;
然后添加where的时候:
var item= ((IQueryable<User>)GetAllUser()).where<User>(x=>x.isStop==true);
只要你转成成IQueryable<TEntity>的时候不出错,就会在数据库中执行过滤条件。

要把(from u in db.User select u)看成是一个查询对象,而是查询结果,要等到实际枚举时才会执行查询。
所以在执行GetAllUser().where(。。。)和后面的枚举语句时,要保证db(GetAllUser时候的DbContext)仍然是打开的。

------解决方案--------------------