几条linq查询的优化,求助!~~

xiaoyan21 2015-08-17 03:07:56
大家好,这是一个linq查询的代码,部分内容已封装。
public BaseOrder[] GetAllDocument(DateTime dtBegin, DateTime dtEnd)
{
QswmDataContext qdc = this.CreateDataContext();
var linq = from lx in qdc.GetTable<BaseOrder>()
where lx.editDate.Value.Date >= dtBegin.Date &&
lx.editDate.Value.Date <= dtEnd.Date
select lx;
  //根据权限过滤
var linq1 = linq.PowerFilter<BaseOrder>();
return linq1.ToArray();
}
//权限过滤的方法
public static IQueryable<T> PowerFilter<T>
(this IQueryable<T> source) where T : IShare
{
var users = GetShareUsers("权限分类"); //获取拥有权限的用户,类型为string[] length:大约有800;
var cur = Common.User.LoginName; // 当前用户
var salesUser = Common.SalesUser.LoginName; //当前业务员
var q= from c in source
where c.CreateUser == cur //createUser:创建人
|| c.SalesUser == salesUser //SalesUser:业务员
|| c.ShareUser.Contains(cur) //ShareUser:共享用户
|| users.Contains(c.salesUser) //其它有权限的用户
|| users.Contains(c.CreateUser)
select c;
return q;
}

程序是别人的程序,维护是我在做;
查询性能很低,发现在PowerFilter中花费大量的时间;
最后通过调试艰难的发现生成的sql会出现大量的 in(....),如:
select ... from BaseOrder
where CreateUser in ('u1','u2','u3'..... 'u800') or salesUser in ('u1','u2','u3'..... 'u800')  然**,我不太懂linq;

该如何优化呢? 谢谢帮助!
...全文
221 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
衣舞晨风 2015-08-17
  • 打赏
  • 举报
回复
为啥不直接写sql呢?
newtee 2015-08-17
  • 打赏
  • 举报
回复
用sql server profiler跟踪下linq最终生成的sql语句 然后你优化下
xiaoyan21 2015-08-17
  • 打赏
  • 举报
回复
引用 3 楼 duanzi_peng 的回复:
本身你的 salesUser 属性 ,我猜应该是一个字符串,里边存放的是Id值? Contains 本身会转化成in 。 不太懂的话,推荐你使用Linq Pad 工具 写linq语句。
字段都是字段型,程序是别人写的,我在维护;
exception92 2015-08-17
  • 打赏
  • 举报
回复
本身你的 salesUser 属性 ,我猜应该是一个字符串,里边存放的是Id值? Contains 本身会转化成in 。 不太懂的话,推荐你使用Linq Pad 工具 写linq语句。
xiaoyan21 2015-08-17
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
这种东西都是实时查数据库的?不能考虑将资源及角色对应关系塞入缓存的?
这个没法缓存吧,PowerFilter是一个通用的方法,不同的查询权限数据是不一样的
  • 打赏
  • 举报
回复
这种东西都是实时查数据库的?不能考虑将资源及角色对应关系塞入缓存的?

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧