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值。
上面代码输出: