FineUI 官方论坛

标题: 表头过滤,FilteredData 如何使用 IQueryable 查询 [打印本页]

作者: Mr.Wu    时间: 2015-3-7 21:18
标题: 表头过滤,FilteredData 如何使用 IQueryable 查询
经查看在线demo:http://fineui.com/demo_pro/#/demo_pro/grid/grid_filter.aspx
发现绑定Grid时先获得过滤后的数据:
  1. private void BindGrid()
  2.         {
  3.             DataTable table = GetFilteredTable(Grid1.FilteredData);

  4.             Grid1.DataSource = table;
  5.             Grid1.DataBind();

  6.         }
复制代码
后台cs代码继承于FilteredTablePageBase:public partial class grid_filter : FilteredTablePageBase
而FilteredTablePageBase.cs内GetFilteredTable函数使用了DataSourceUtil.GetDataTable()来获得数据源:


作者: sanshi    时间: 2015-3-7 21:45
不需要转换,直接在 IQueryable 中指定查询条件,其实和表格上面放一个Form进行查询是一个道理。

AppBoxPro中有很多类似的处理,比如用户列表页面:
  1. IQueryable<User> q = DB.Users; //.Include(u => u.Dept);

  2.             // 在用户名称中搜索
  3.             string searchText = ttbSearchMessage.Text.Trim();
  4.             if (!String.IsNullOrEmpty(searchText))
  5.             {
  6.                 q = q.Where(u => u.Name.Contains(searchText) || u.ChineseName.Contains(searchText) || u.EnglishName.Contains(searchText));
  7.             }

  8.             q = q.Where(u => u.Name != "admin");

  9.             //if (GetIdentityName() != "admin")
  10.             //{
  11.             //    q = q.Where(u => u.Name != "admin");
  12.             //}

  13.             // 过滤启用状态
  14.             if (rblEnableStatus.SelectedValue != "all")
  15.             {
  16.                 q = q.Where(u => u.Enabled == (rblEnableStatus.SelectedValue == "enabled" ? true : false));
  17.             }

  18.             // 在查询添加之后,排序和分页之前获取总记录数
  19.             Grid1.RecordCount = q.Count();

  20.             // 排列和数据库分页
  21.             q = SortAndPage<User>(q, Grid1);

  22.             Grid1.DataSource = q;
  23.             Grid1.DataBind();
复制代码


====
官网示例的做法 source.Clone(); 其实在实际中不可取,因为示例项目没用到数据库,必须通过这种做法
作者: Mr.Wu    时间: 2015-3-8 11:17
sanshi 发表于 2015-3-7 21:45
不需要转换,直接在 IQueryable 中指定查询条件,其实和表格上面放一个Form进行查询是一个道理。

AppBoxP ...

直接指定查询条件?不太明白。
找了个在线demo:http://fineui.com/demo_pro/defau ... r_dropdownlist.aspx
过滤时Grid1.FilteredData.ToString()的值为JArray,如下:
  1. [
  2.   {
  3.     "column": "EntranceYear",
  4.     "field": "EntranceYear",
  5.     "multi": true,
  6.     "matcher": "all",
  7.     "items": [
  8.       {
  9.         "operator": "greater",
  10.         "value": 2002
  11.       }
  12.     ]
  13.   },
  14.   {
  15.     "column": "Major",
  16.     "field": "Major",
  17.     "multi": false,
  18.     "item": {
  19.       "value": [
  20.         "数学系"
  21.       ]
  22.     }
  23.   }
  24. ]
复制代码
假设查询时默认语句为:IQueryable<data> q = DB.datas;
请教一下:如何将上面的过滤条件指定进来?
谢谢。


作者: sanshi    时间: 2015-3-9 10:34
Mr.Wu 发表于 2015-3-8 11:17
直接指定查询条件?不太明白。
找了个在线demo:http://fineui.com/demo_pro/default.aspx#/demo_pro/grid ...


其实就是循环,根据特定情景添加查询条件,比如对 column=Major 的简单处理(未在真实环境测试):
  1. IQueryable<User> q = DB.Users;
  2. // 遍历过滤项
  3. foreach (JObject filteredObj in Grid1.FilteredData)
  4. {
  5.         // 如果是 Major 过滤项
  6.         if (filteredObj.Value<string>("column") == "Major")
  7.         {
  8.                 // Major过滤项的值是一个数组
  9.                 JArray values = filteredObj.Value<JObject>("item").Value<JArray>("value");

  10.                 // 如果数据库中某条数据的 Major 包含在本数组中,则检索出来
  11.                 q = q.Where(u => values.Contains(u.Name));
  12.         }
  13. }
复制代码




作者: Mr.Wu    时间: 2015-3-18 17:21
sanshi 发表于 2015-3-9 10:34
其实就是循环,根据特定情景添加查询条件,比如对 column=Major 的简单处理(未在真实环境测试):

分享一个在真实环境中测试通过的后台代码:
  1. // 遍历过滤项
  2.             foreach (JObject filteredObj in Grid1.FilteredData)
  3.             {
  4.                 // 过滤性别
  5.                 if (filteredObj.Value<string>("column") == "xingbie")
  6.                 {
  7.                     string sXb = filteredObj.Value<JObject>("item").Value<object>("value").ToString();
  8.                     // 如果数据库中某条数据的Xingbie包含在本数组中,则检索出来
  9.                     q = q.Where(u => u.xingbie.Equals(sXb));
  10.                 }

  11.                 //过滤成绩
  12.                 if (filteredObj.Value<string>("column") == "tiyu")
  13.                 {
  14.                     bool multi = filteredObj.Value<bool>("multi");
  15.                     if (multi)
  16.                     {
  17.                          JArray items = filteredObj.Value<JArray>("items");
  18.                         foreach (JObject item in items)
  19.                         {
  20.                             string itemOperator = item.Value<string>("operator");
  21.                             int ty = Int32.Parse(item.Value<object>("value").ToString());
  22.                             if (itemOperator == "greater")
  23.                             {
  24.                                 q = q.Where(u => u.tiyu > ty);
  25.                             }
  26.                             else if (itemOperator == "less")
  27.                             {
  28.                                 q = q.Where(u => u.tiyu < ty);
  29.                             }
  30.                             else if (itemOperator == "equal")
  31.                             {
  32.                                 q = q.Where(u => u.tiyu == ty);
  33.                             }
  34.                         }
  35.                     }
  36.                 }
  37.             }
复制代码







欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/) Powered by Discuz! X3.4