using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Linq.Expressions; namespace Model
{
[NotMapped]
public class FilterInfo
{
/// <summary>
/// 字段名称
/// </summary>
public string FieldName { get; set; }
/// <summary>
/// 字段值
/// </summary>
public object FieldValue { get; set; }
/// <summary>
/// 操作符
/// </summary>
public FilterOperator Operator { get; set; }
/// <summary>
/// 构建表达式
/// </summary>
/// <returns></returns>
public Func<T, bool> BuildExpression<T>()
{
var constEexp = Expression.Constant(FieldValue, this.FieldValue.GetType());
var paramExp = Expression.Parameter(typeof(T), "x");
Expression expLeft = null;
var tp = typeof(T);
//基元类型直接去paramExp,自定义类型取PropExp
if (!tp.IsPrimitive && tp != typeof(string))
{
expLeft = (Expression)Expression.Property(paramExp, FieldName);
}
else
{
expLeft = paramExp;
}
Expression bExp = null;
switch (Operator)
{
case FilterOperator.GreaterThan://>
bExp = Expression.GreaterThan(expLeft, constEexp);
break;
case FilterOperator.GreaterThanOrEqual://>=
bExp = Expression.GreaterThanOrEqual(expLeft, constEexp);
break;
case FilterOperator.LessThan://<
bExp = Expression.LessThan(expLeft, constEexp);
break;
case FilterOperator.LessThanOrEqul://<=
bExp = Expression.LessThanOrEqual(expLeft, constEexp);
break;
case FilterOperator.OrElse://!=
bExp = Expression.NotEqual(expLeft, constEexp);
break;
case FilterOperator.Like:
if (this.FieldValue.GetType() != typeof(string))
{
throw (new Exception("Like只能用于string类型的字段操作"));
}
bExp = Expression.Call(typeof(FilterInfo).GetMethod("Contains", new Type[] { typeof(string), typeof(string) }), expLeft, constEexp);
break;
default://=
bExp = Expression.Equal(expLeft, constEexp);
break;
}
var exp = Expression.Lambda<Func<T, bool>>(bExp, paramExp);
Console.WriteLine(exp);
return exp.Compile();
}
/// <summary>
/// 用该静态方法实现like
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static bool Contains(string a, string b)
{
if (string.IsNullOrEmpty(a) || string.IsNullOrEmpty(b))
{
return false;
}
return a.Contains(b);
}
}
/// <summary>
/// 操作符枚举
/// </summary>
public enum FilterOperator
{
/// <summary>
/// >
/// </summary>
GreaterThan,
/// <summary>
/// =
/// </summary>
Equal,
/// <summary>
/// <
/// </summary>
LessThan,
/// <summary>
/// <=
/// </summary>
LessThanOrEqul,
/// <summary>
/// >=
/// </summary>
GreaterThanOrEqual,
/// <summary>
/// !=
/// </summary>
OrElse,
/// <summary>
/// contain
/// </summary>
Like
}
}

使用该表达式生成器,可以生成简单的匿名查询函数来过滤查询结果。如果我们在项目中用了EF框架,就可以在业务层中通过这个类来构建查询条件然后传到DAL层来执行,使用方法如下:

 //整形数组查询
int[] nums = { , , , , , , , , , };
FilterInfo filterInt = new FilterInfo() { FieldName = "x", FieldValue = , Operator = FilterOperator.LessThanOrEqul };
var intFunc = filterInt.BuildExpression<int>();
var r = nums.Where(intFunc);
foreach (var i in r)
{
Console.WriteLine(i);
}
Console.WriteLine("int array search complete");
//字符串数组查询
string[] strArray = { "string1", "string11", "string2", "string2134", "stringOld" };
FilterInfo f = new FilterInfo() { FieldName = "x", FieldValue = "", Operator = FilterOperator.Like };
var fc = f.BuildExpression<string>();
strArray.Where(fc).ToList().ForEach(s => Console.WriteLine(s));
//对象列表查询
List<Org> orglist = new List<Org>();
orglist.Add(new Org() { Guid = Guid.NewGuid().ToString(), Name = "spring" });
for (int i = ; i < ; i++)
{
orglist.Add(new Org() { Guid = Guid.NewGuid().ToString(), Name = "orgName" + Guid.NewGuid().ToString() });
}
FilterInfo filter = new FilterInfo() { FieldName = "Name", FieldValue = "Name", Operator = FilterOperator.Like };
var func = filter.BuildExpression<Org>();
var orgSearchList = orglist.Where(func);
foreach (var o in orgSearchList)
{
Console.WriteLine(o.Name);
}
Console.WriteLine("org list search Complete");

基于Linq表达式做的一个简单的表达式生成器的更多相关文章

  1. [Ruby on Rails系列]6、一个简单的暗语生成器与解释器(上)

    [0]Ruby on Rails 系列回顾 [Ruby on Rails系列]1.开发环境准备:Vmware和Linux的安装 [Ruby on Rails系列]2.开发环境准备:Ruby on Ra ...

  2. 基于Spring aop写的一个简单的耗时监控

    前言:毕业后应该有一两年没有好好的更新博客了,回头看看自己这一年,似乎少了太多的沉淀了.让自己做一个爱分享的人,好的知识点拿出来和大家一起分享,一起学习. 背景: 在做项目的时候,大家肯定都遇到对一些 ...

  3. 基于gin框架搭建的一个简单的web服务

    刚把go编程基础知识学习完了,学习的时间很短,可能还有的没有完全吸收.不过还是在项目中发现知识,然后在去回顾已学的知识,现在利用gin这个web框架做一个简单的CRUD操作. 1.Go Web框架的技 ...

  4. 一个简单的ruby生成器例子(用连续体Continuation实现)

    ruby中有很多经典的驱动器结构,比如枚举器和生成器等.这次简单介绍下生成器的概念.生成器是按照功能要求,一次产生一个对象,或称之为生成一个对象的方法.ruby中的连续体正好可以用来完成生成器的功能. ...

  5. 7. Swift 基于Xmpp和openfire实现一个简单的登录注册

    1. 基本步骤:首先导入Xmpp框架,配置环境 ->由于我们使用的是OC的Xmpp框架,再进行Swift开发时需要进行桥接. 具体方法就是创建一个基于c的.h的头文件,然后将我们需要编译OC的语 ...

  6. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(二)

    上一节已经说了如何编译idl文件.现在就用编好的文件来写一个最小的corba小程序的.程序分为服务器程序和客户端程序. 说明下,代码是<基于C++CORBA高级编程>一书中的例子. 1.首 ...

  7. JS 的execCommand 方法 做的一个简单富文本

    execCommand 当一个 HTML 文档切换到设计模式(designMode)时,文档对象暴露 execCommand 方法,该方法允许运行命令来操纵可编辑区域的内容.大多数命令影响文档的选择( ...

  8. 基于ACE的TAO开发---一个简单的入门实例-----VS2008(一)

    万事开头难,不管做什么事最开始总是最困难的,一旦上手了就好了. 这也是我自己学习corba编程的一点经验和心得.下面的例子主要是保证读者跟着走能立马看到效果. 1.机器上的TAO是实现已经装好的开发版 ...

  9. 基于傅里叶变换和PyQt4开发一个简单的频率计数器

    小学期的<信号与系统>课,要求写一个频率计数器,下面是我个人理解的频率计数 傅里叶变换的代码: # coding=utf-8 import numpy as np from scipy.i ...

随机推荐

  1. 使用高精度计算斐波那契数列 c++

    使用高精度计算斐波那契数列 非高精度 Code(Non-high accuracy) 这是不用高精度的代码 #include<bits/stdc++.h> using namespace ...

  2. 6-Z字形变换

    6-Z字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C ...

  3. MySQL 8 批处理模式

    shell> mysql -h host -u user -p < batch-file 强制执行脚本,即使某些语句参数错误,可以添加 --force 参数 如果MySQL运行在Windo ...

  4. 【JavaScript】JS总结 – 乱

    一. 重要:js中的function函数声明.函数表达式 // 函数声明 // Ex: 会在代码执行之前提前加载到作用域中,即js解析器会优先读取,确保在所有代码执行之前声明已经被解析:所以可以在定义 ...

  5. CF718C Sasha and Array [线段树+矩阵]

    我们考虑线性代数上面的矩阵知识 啊呸,是基础数学 斐波那契的矩阵就不讲了 定义矩阵 \(f_x\) 是第 \(x\) 项的斐波那契矩阵 因为 \(f_i * f_j = f_{i+j}\) 然后又因为 ...

  6. Hadoop集群初步搭建:

    自己整理了一下Hadoop集群简易搭建的过程,感谢尚观科技贾老师的授课和指导! 基本环境要求:能联网电脑一台:装有Centos系统的VMware虚拟机:Xmanager Enterprise 5软件. ...

  7. c基本语法和数据类型

    一.C语言结构 C 程序主要包括以下部分: 预处理器指令 函数 变量 语句 & 表达式 注释 二.基本语法 1.  分号是语句结束符. 2. 单行注释//.多行注释/* */. 3. 标识符是 ...

  8. jquery的封装与对象学习

    1.封装学习 /// <reference path="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js" /> ...

  9. [POI2010] GIL-Guilds - 二分图染色,DFS

    给一张无向图,要求你用黑白灰给点染色,且满足对于任意一个黑点,至少有一个白点和他相邻:对于任意一个白点,至少有一个黑点与他相邻,对于任意一个灰点,至少同时有一个黑点和白点和灰点与他相邻,问能否成功 S ...

  10. 3级搭建类301-Oracle 11g RAC 双节点搭建(11.2.0.4)非公

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...