现在的位置: 首页 > 综合 > 正文

C#基础之 — 数据过滤

2019年10月16日 ⁄ 综合 ⁄ 共 1817字 ⁄ 字号 评论关闭

1 应用场景

经常我们会从数据库中查询出DataTable,这个时候显示到页面上的时候就需要过滤掉一些当前用户不能/不希望看到的记录。

此时就要用到数据过滤了。

2 代码

下面是一个过滤掉DataTable中存储的所有人员记录的女性的完整示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Linq.Expressions;
using System.Data;

namespace LamdaDataFilter
{
    class Program
    {
        static void Main(string[] args)
        {
            //将DataTable转换成DataRow的迭代器
            DataTable input_dt = BuildTestTable();            
            IEnumerable<DataRow> drArray = input_dt.AsEnumerable();

            //编写,编译,并执行lamda表达式
            Expression<Func<DataRow, bool>> critical = p => GenderFilter(p, "男");   //返回所有男丁
            var queryByCritical = drArray.Where(critical.Compile());

            //输出经过过滤之后的DataTale
            DataTable output_dt = null;
            if (queryByCritical != null && queryByCritical.Count() > 0)
            {
                output_dt = queryByCritical.CopyToDataTable();
            }
            if (output_dt != null)
            {
                foreach (DataRow dr in output_dt.Rows)
                {
                    Console.WriteLine(String.Format("姓名:{0},性别:{1},年龄:{2}", dr["name"], dr["gender"], dr["age"]));
                }
            }
        }

        /// <summary>
        /// 决定当前行是否应该被过滤掉
        /// </summary>
        /// <param name="dr"></param>
        /// <returns></returns>
        static bool GenderFilter(DataRow dr, string gender)
        {
            if (dr["gender"].Equals(gender)) return true;
            return false;
        }

        /// <summary>
        /// 初始化好一个DataTale用于测试
        /// </summary>
        /// <returns></returns>
        static DataTable BuildTestTable()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("age", typeof(int));
            dt.Columns.Add("gender", typeof(string));

            DataRow dr = dt.NewRow();
            dr["name"] = "zhangsan";
            dr["age"] = 22;
            dr["gender"] = "男";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["name"] = "lisi";
            dr["age"] = 19;
            dr["gender"] = "男";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["name"] = "wangfang";
            dr["age"] = 19;
            dr["gender"] = "女";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr["name"] = "赵龙";
            dr["age"] = 19;
            dr["gender"] = "男";
            dt.Rows.Add(dr);

            return dt;
        }
    }
}

lamda表达式 : p=>表达式/函数 , 意思是输入是p,输出就是后面的表达式或者函数。
比如 x=>x+x,就是入x,输出x+x。
p => GenderFilter(p, "男") 就是输入时p,输出是GenderFilter(p, "男")的返回值。
前面的:Expression<Func<DataRow, bool>> 定义了这个lamda表达式的输入时DataRow,输出是bool值。

上面代码输出:

抱歉!评论已关闭.