FineUI 官方论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

本论坛已关闭(禁止注册、发帖和回复)
请移步 三石和他的朋友们

FineUI首页 WebForms - MVC & Core - JavaScript 常见问题 - QQ群 - 十周年征文活动

FineUI(开源版) 下载源代码 - 下载空项目 - 获取ExtJS - 文档 在线示例 - 版本更新 - 捐赠作者 - 教程

升级到 ASP.NET Core 3.1,快、快、快! 全新ASP.NET Core,比WebForms还简单! 欢迎加入【三石和他的朋友们】(基础版下载)

搜索
查看: 3995|回复: 4
打印 上一主题 下一主题

表头过滤,FilteredData 如何使用 IQueryable 查询

[复制链接]
跳转到指定楼层
楼主
发表于 2015-3-7 21:18:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
经查看在线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()来获得数据源:




    1.     // 表格过滤
    2.     protected DataTable GetFilteredTable(JArray filteredData)
    3.     {
    4.     DataTable source = DataSourceUtil.GetDataTable();
    5.      
    6.     DataTable result = source.Clone();
    7.     ……
    复制代码
    DataSourceUtil.GetDataTable()这个函数是在线demo使用的统一数据源。

    问题来了:在实际项目或AppBoxPro中,绑定Grid数据时,几乎不是DataTable形式的,而是像下面这样:
    1.         private void BindGrid()
    2.         {
    3.             IQueryable<zk_tiyu> q = DB.zk_tiyus;
    4.             // 在查询添加之后,排序和分页之前获取总记录数
    5.             Grid1.RecordCount = q.Count();
    6.             // 排列和数据库分页
    7.             q = SortAndPage<zk_tiyu>(q, Grid1);
    8.             Grid1.DataSource = q;
    9.             Grid1.DataBind();
    10.         }
    复制代码
    难点:如何把IQueryable<zk_tiyu> q =……查询出来数据转为GetFilteredTable函数内所需的数据格式(DataTable)?
    希望得到大家的帮助,谢谢。


沙发
发表于 2015-3-7 21:45:44 | 只看该作者
不需要转换,直接在 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(); 其实在实际中不可取,因为示例项目没用到数据库,必须通过这种做法
板凳
 楼主| 发表于 2015-3-8 11:17:20 | 只看该作者
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;
请教一下:如何将上面的过滤条件指定进来?
谢谢。

地板
发表于 2015-3-9 10:34:22 | 只看该作者
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. }
复制代码



5#
 楼主| 发表于 2015-3-18 17:21:14 | 只看该作者
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 官方论坛 ( 皖ICP备2021006167号-1 )

GMT+8, 2024-11-23 07:15 , Processed in 0.044378 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表