首页 新闻 会员 周边 捐助

关于LINQ 多条件查询

0
悬赏园豆:40 [已解决问题] 解决于 2015-10-21 13:56
        /// <summary>
        /// 用户登录日志列表
        /// </summary>
        /// <param name="userName">用户名</param>
        /// <param name="nowNumber">当前数字</param>
        /// <param name="pageSize">长度</param>
        /// <param name="rowCount">总行数</param>
        /// <returns>用户登录日志列表</returns>
        public IQueryable<object> LoadLogList(string userName, int nowNumber, int pageSize, out int rowCount)
        {
            IQueryable<object> result = null;
            if (String.IsNullOrEmpty(userName))
            {
                result = from a in db.Set<AdminLoginLog>()
                         join b in db.Set<Admin>() on a.AdminId equals b.AdminId into b_join
                         from b in b_join.DefaultIfEmpty()
                         orderby
                           a.AdminLoginTime descending
                         select new
                         {
                             AdminId = (Int32?)a.AdminId,
                             AdminLoginAddress = a.AdminLoginAddress,
                             a.AdminLoginBrowser,
                             a.AdminLoginIP,
                             a.AdminLoginLogId,
                             a.AdminLoginTime,
                             AdminUserName = b.AdminUserName
                         };
            }
            else
            {
                result = from a in db.Set<AdminLoginLog>()
                         join b in db.Set<Admin>() on a.AdminId equals b.AdminId into b_join
                         from b in b_join.DefaultIfEmpty()
                         where
                            b.AdminUserName == userName
                         orderby
                           a.AdminLoginTime descending
                         select new
                         {
                             AdminId = (Int32?)a.AdminId,
                             a.AdminLoginAddress,
                             a.AdminLoginBrowser,
                             a.AdminLoginIP,
                             a.AdminLoginLogId,
                             a.AdminLoginTime,
                             AdminUserName = b.AdminUserName
                         };
            }
            rowCount = result.Count();
            result = result.Skip(nowNumber).Take(pageSize);
            return result;
        }

这有没有什么好的方法动态拼接下where 语句,请各位指点下

yjq_net的主页 yjq_net | 初学一级 | 园豆:2
提问于:2015-10-21 13:43
< >
分享
最佳答案
0

你分开来 linq是延迟加载的,你先查询出result,然后判断String.IsNullOrEmpty(userName) 中执行result=result.where(m=>m.AdminUserName == userName)

而且你用orm了.返回object是什么鬼?

收获园豆:20
吴瑞祥 | 高人七级 |园豆:29449 | 2015-10-21 13:50

  这样的话,m.AdminUserName这个好像是点不出来的吧

yjq_net | 园豆:2 (初学一级) | 2015-10-21 13:51

 from a in db.Set<AdminLoginLog>() join b in db.Set<Admin>() on a.AdminId equals b.AdminId into b_join from b in b_join.DefaultIfEmpty()  那么这个我 select 什么啊

yjq_net | 园豆:2 (初学一级) | 2015-10-21 13:52

@yjq_叶: 你别把result定义成object就行了.用var去接..

ORM的一大目的就是强类型.你这样弄成object就白弄了.

吴瑞祥 | 园豆:29449 (高人七级) | 2015-10-21 13:52
其他回答(5)
0

不使用匿名类型或者把where在查询里写两遍

收获园豆:10
alby | 园豆:323 (菜鸟二级) | 2015-10-21 13:49

 但是我查的时候是两个表的数据,怎么可以不用匿名类啊

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-10-21 13:51
0

你可以看一下where(参数)里面的参数是什么类型,当然可能动态构建,在这里传进去就可以了。我之前的一篇博问中有这样的代码,你可以参考 http://q.cnblogs.com/q/73479/

收获园豆:10
空明流光 | 园豆:111 (初学一级) | 2015-10-21 13:54

谢谢  谢谢 我好像会了

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-10-21 13:55
0

把需要where判断的Admin拆分出来,然后定义类似于下面的where谓词。调用Where方法。 最后再与其他的实体如AdminLoginLog去关联查数据

Expression<Func<BizDatOrders, bool>> where = p => p.OrderModifiedTime >= _TimeFrom && p.OrderModifiedTime <= _TimeTo;
buguge | 园豆:399 (菜鸟二级) | 2015-10-22 13:15

额 我最后也是差不多这么解决的啊 非常感谢啊

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-10-23 16:50
0

你这段代码可以这样写:

result = from a in db.Set<AdminLoginLog>()

           join b in db.Set<Admin>() on a.AdminId equals b.AdminId into b_join from b in       b_join.DefaultIfEmpty()

          where    (String.IsNullOrEmpty(userName)?true:b.AdminUserName == userName)

orderby a.AdminLoginTime descending select new { AdminId = (Int32?)a.AdminId, AdminLoginAddress = a.AdminLoginAddress, a.AdminLoginBrowser, a.AdminLoginIP, a.AdminLoginLogId, a.AdminLoginTime, AdminUserName = b.AdminUserName };

kevinzw | 园豆:208 (菜鸟二级) | 2015-10-23 16:46

谢谢谢谢 我有个疑问 加入 where    (String.IsNullOrEmpty(userName)?true:b.AdminUserName == userName) 就是当userName为空的时候 数据库的查询字段会有where这个条件吗

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-10-23 16:50

@yjq_叶: 为空的话where条件永为true,这个可以有。用var接收延迟用where也可以。

支持(0) 反对(0) hahanonym | 园豆:1460 (小虾三级) | 2015-10-23 23:01
0

http://esql.codeplex.com/

可以使用这个框架

麦舒 | 园豆:452 (菜鸟二级) | 2015-10-24 16:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册