Expression 动态查询的 使用小结

Linq  Expression  的动态查询使用小结, 我也是根据这个大神的例子做的,并小结http://www.cnblogs.com/lyj/archive/2008/03/25/1122157.html

命名空间 System.Linq.Expression

以查询Customer 为例 ,增加一个Where条件

 
Expression whereExpression = Expression.Call(
     typeof(Queryable), "Where",
     new Type[] { typeof(Customer) } ,
     Expression.Constant(queryCustomer), expression
 );

queryCustomer 是 IQueryable 类型

exprssion 是  Expression> 类型 ,是一个方法的参数 

Expression.Contant方法把一个数据源作为 Expression

然后就可以根据这个Expression查询

var result = queryCustomer.Provider.CreateQuery(whereExpression);
          
foreach (var c in result)
{
     Console.WriteLine("name:{0},datetime:{1}",c.Name,c.CreatedDate);
}

这只是一个where 表达式,根据Call方法当前重载的定义可以发现,

第一个参数 typeof(Queryable) 与第二参数  "Where"

代表 调用  Queryable类 的 Where 静态方法,

第三个参数  Type[]  是 泛型方法的类型参数列表

第四个参数 Expression[] 是 传入 Where 方法(根据Call方法的第二个String参数) 的 参数


查看 Where 方法定义就可以知道大概的意思

public static IQueryable Where(this IQueryable source, Expression> predicate);
        
public static IQueryable Where(this IQueryable source, Expression> predicate);

//刚才的调用,这里的参数都可以对应上Where方法的类型参数和参数
Expression whereExpression = Expression.Call(
     typeof(Queryable), "Where",
     new Type[] { typeof(Customer) } ,
     Expression.Constant(queryCustomer), expression
 );

另外再说一下OrderBy ,在刚在的where基础上再加上orderby,根据 

// c=>c.CreatedDate
ParameterExpression param = Expression.Parameter(typeof(Customer),"c");

Expression propertyExpression =Expression.Lambda(Expression.Property(param, "CreatedDate"), param);

// query.OrderBy(c=>c.CreateDate), 因为 CreatedDate 是DateTime类型,所以,要typeof(DateTime)

Expression orderbyExpression = Expression.Call( 
    typeof(Queryable),
    "OrderBy", new Type[] { typeof(Customer), typeof(DateTime) },
     whereExpression, propertyExpression 
);


//Customer 的定义
public class Customer
    {
        public virtual int ID { get; set; }
        public virtual String Name { get; set; }
        public virtual DateTime CreatedDate { get; set; }
      
    }

// 参考OrderBy定义

public static IOrderedQueryable OrderBy(this IQueryable source, Expression> keySelector);
public static IOrderedQueryable OrderBy(this IQueryable source, Expression> keySelector, IComparer comparer); 

 
  

 
  

完整代码

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

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            NHibernate.Cfg.Configuration cfg = new NHibernate.Cfg.Configuration();
            var factory = cfg.Configure().BuildSessionFactory();
            var session = factory.OpenSession();
            
            TestCase3(session,x=>x.CreatedDate > DateTime.Parse("1999-1-1"));
            
            session.Close();

            Console.ReadLine();
        }


        static void TestCase3(NHibernate.ISession session,Expression> expression)
        {
            
            IQueryable queryCustomer = session.Query();
             
            ParameterExpression param = Expression.Parameter(typeof(Customer),"cccc");

            Expression whereExpression = Expression.Call(
                typeof(Queryable), "Where",
                new Type[] { typeof(Customer) } ,
                Expression.Constant(queryCustomer), expression
            );

            Expression propertyExpression =Expression.Lambda(Expression.Property(param, "CreatedDate"), param);

          
            Expression orderbyExpression = Expression.Call(
                typeof(Queryable), "OrderBy",
                new Type[] { typeof(Customer), typeof(DateTime) },
                whereExpression,
                propertyExpression
            );

            var result = queryCustomer.Provider.CreateQuery(orderbyExpression);
           
            foreach (var c in result)
            {
                Console.WriteLine("name:{0},datetime:{1}",c.Name,c.CreatedDate);
            }
        }

         

         
    }
}


  最后鄙视一下CSDN的前端,  HTML编辑器BUG太多了,害我改了好几次@CSDN。。。

 
  
 
  
 
 

你可能感兴趣的:(c#/.net)