public IQueryable<TEntity> Find<TEntity>(TEntity obj) where TEntity : class
NorthwindDataContext db = new NorthwindDataContext(); //先new出一个对象 Customer c = new Customer(); //添入我们知道的最基本的信息,可以从ui获得 c.City = "London"; c.Phone = "23236133"; //call函数find返回结果 var q = db.Find<Customer>(c);
Func<int,int> f = x => x + 1; // Code Expression<Func<int,int>> e = x => x + 1; // Data
// 先构造了一个ParameterExpression对象,这里的c,就是Lambda表达中的参数。(c=>) ParameterExpression param = Expression.Parameter(typeof(TEntity), "c"); //构造表达式的右边,值的一边 Expression right = Expression.Constant(p.GetValue(obj, null)); //构造表达式的左边,property一端。 Expression left = Expression.Property(param, p.Name); //生成筛选表达式。即c.CustomerID == "Tom" Expression filter = Expression.Equal(left, right); //生成完整的Lambda表达式。 Expression<Func<TEntity, bool>> pred = Expression.Lambda<Func<TEntity, bool>>(filter, param); //在这里,我们使用的是and条件。 query = query.Where(pred);
public IQueryable<TEntity> Find<TEntity>(TEntity obj) where TEntity : class { //获得所有property的信息 PropertyInfo[] properties = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); //构造初始的query IQueryable<TEntity> query = this.GetTable<TEntity>().AsQueryable<TEntity>(); //遍历每个property foreach (PropertyInfo p in properties) { if (p != null) { Type t = p.PropertyType; //加入object,Binary,和XDocument, 支持sql_variant,imager 和xml等的影射。 if (t.IsValueType || t == typeof(string) || t == typeof(System.Byte[]) || t == typeof(object) || t == typeof(System.Xml.Linq.XDocument) || t == typeof(System.Data.Linq.Binary)) { //如果不为null才算做条件 if ( p.GetValue(obj, null) != null) { ParameterExpression param = Expression.Parameter(typeof(TEntity), "c"); Expression right = Expression.Constant(p.GetValue(obj, null)); Expression left = Expression.Property(param, p.Name); Expression filter = Expression.Equal(left,right); Expression<Func<TEntity, bool>> pred = Expression.Lambda<Func<TEntity, bool>>(filter, param); query = query.Where(pred); } } } } return query; }