关于动态生成Lambda表达式的问题

张狗蛋儿 2010-04-20 05:31:34
我看了这篇文章
http://developer.51cto.com/art/200909/151563.htm
但上面讲的例子都是对值类型进行筛选
比如:
var ints =   new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  
var r = ints.Where(i => i > 5);


如果是引用类型呢,比如我是一个类型的数组
比如MyClass[] list;
而我要以MyClass.Name这个属性来筛选且,这个属性不是固定的而是动态的该怎么来实现呢?求达人指教
...全文
356 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
hustzs 2011-10-13
  • 打赏
  • 举报
回复
row32,你是怎么解决的?我也要用到这种方法,请回复
张狗蛋儿 2010-04-21
  • 打赏
  • 举报
回复
感谢各位的解答,我已经解决了。请接分
  • 打赏
  • 举报
回复
例如:

var query=from x in db select x;
if(!起始日期.IsNull)
query=query.where(x=> x.date >= 起始日期.Value);
if(姓名!=null && 姓名!=string.Empty)
query=(from x in query where x.StartWith(姓名) select x;


linq会推迟执行,直到必须输出查询结果的时候才开始以状态机迭代方式尽快产生第一个查询结果。大多数正规的linq provider产品都会对query进行编译、优化,产生最优的SQL语句(或者其它原生查询语言),如果表达式中有无法编译为底层查询语言的Linq也可以处理。
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
动态。。。。。。。
阿非 2010-04-20
  • 打赏
  • 举报
回复

public class Entity
{
public int ID { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
}



ParameterExpression paramExpr = Expression.Parameter(typeof(Entity), "e");

string field = "Name";

string content = "x";

MemberExpression mExpr = Expression.Property(paramExpr, field); // 根据field创建属性表达式
ConstantExpression cExpr = Expression.Constant(content, typeof(string)); // 创建表示content变量值的表达式
BinaryExpression bExpr = Expression.Equal(mExpr, cExpr); // 创建等于content参数值的表达式

Expression whereExpr = bExpr;


Expression<Func<Entity, bool>> lambda;
// 生成Lambda表达式
if (whereExpr != null)
lambda = Expression.Lambda<Func<Entity, bool>>(whereExpr, paramExpr);
else
lambda = null;

//////////////////////////////我是分隔线//////////////////////////////////////////////////

IList<Entity> list = new List<Entity>();

Entity e = new Entity();

e.ID = 1;
e.Name = "x";
e.Sex = "男";

list.Add(e);

e = new Entity();

e.ID = 2;
e.Name = "y";
e.Sex = "男";

list.Add(e);

e = new Entity();

e.ID = 3;
e.Name = "z";
e.Sex = "女";

list.Add(e);

var resultList = list.Where<Entity>(lambda.Compile());


分隔线以上的部分 可以定义成方法

并且 可以使用 Expression.And 来 拼接 条件

多条件拼接时 代码写在 Expression whereExpr = bExpr;

wjq 2010-04-20
  • 打赏
  • 举报
回复
MakeGenericMethod来为Func<T,TResult>规定类型
张狗蛋儿 2010-04-20
  • 打赏
  • 举报
回复
反射我也试过了,但lambda表达式的Func<T,TResult>委托的T不能是个GetType()得到的类型,而必须是固定的类型名。实在是郁闷,卡在这问题几天了。
张狗蛋儿 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sandy945 的回复:]
那你或许需要用到 反射

但我觉得 这是不必要的

你希望是A 属性时

写 list.Where(myClass => myClass.A =="");

是B属性时

list.Where(myClass => myClass.B > 0);
[/Quote]
但是如果myClass是个实体,里面有20多个属性字段 我根据UI用户选择字段、操作符和比较的值动态生成lambda表达式
阿非 2010-04-20
  • 打赏
  • 举报
回复
那你或许需要用到 反射

但我觉得 这是不必要的

你希望是A 属性时

写 list.Where(myClass => myClass.A =="");

是B属性时

list.Where(myClass => myClass.B > 0);
张狗蛋儿 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zsuswy 的回复:]
一样的使用啊:
----给你个简单的例子,临时写的,你自己回去调一下
class MyObj
{
public int Num = 5;
}

var objs = new MyObj[] { new MyObj(), new MyObj(), new MyObj() };
var resultArray = objs.Where(obj => obj.Num > 1);
[/Quote]
这个我也会,我意思是要动态构建,你看下我前面那个地址嘛。也就是
我根据UI用户输入的条件动态创建Lambda表达式。
张狗蛋儿 2010-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sandy945 的回复:]
这个属性不是固定的而是动态的该怎么来实现呢

你这个动态是什么意思
[/Quote]

意思是属性不固定,有可能是A属性也有可能是B属性
zsuswy 2010-04-20
  • 打赏
  • 举报
回复
一样的使用啊:
----给你个简单的例子,临时写的,你自己回去调一下
class MyObj
{
public int Num = 5;
}

var objs = new MyObj[] { new MyObj(), new MyObj(), new MyObj() };
var resultArray = objs.Where(obj => obj.Num > 1);
阿非 2010-04-20
  • 打赏
  • 举报
回复
这个属性不是固定的而是动态的该怎么来实现呢

你这个动态是什么意思

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧