读书人

linq 查询Where 有关问题

发布时间: 2013-08-16 14:29:57 作者: rapoo

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)仍然是打开的。

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


只要保证使用IQueryable<T>,可以添加查询,因为直到使用foreach遍历,或者转化为IEnumerable<T>,它只是查询表达式,并没有真正执行。

IQueryable<T>因为在数据库上运行,所以使用有限制,比如不能使用很多函数。

读书人网 >.NET

热点推荐