首页 新闻 会员 周边

关于lambda表达式的反射问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-04-26 12:19

排序时需传递某个参数指明按照哪个字段排序,一个用户表User,有Name和ID属性,按名称或ID排序;传递进来的是order=name,或者order=id;

那么我需要在数据库中这么排序:

allUsers.OrderBy(u => u.Name);

当然Name是我写的,不能通用,只能用反射了。

allUsers.OrderBy(u => u.GetType().GetProperty(order));

这不一定对,不知道此时应该怎么处理。

Zigzag的主页 Zigzag | 初学一级 | 园豆:70
提问于:2012-04-26 09:57
< >
分享
最佳答案
0

这里用反射不好。

1——

会影响运行效率

2——

假如是SQL LINQ的话,没办法转换为SQL语句

或许可以用下面的方案:

1——

在方法调用的时候传递一个Lamda表达式而不是传递属性名

2——

使用动态变量

3——

(这个方案跟你用反射其实类似了)使用动态变量的字典构建。

收获园豆:8
无之无 | 大侠五级 |园豆:5095 | 2012-04-26 10:08

方法1.在bs场景下,是不行的,必须用Linq的话,怎么也逃不过这个反射的过程。排序字段名称到对象属性名称的映射始终是存在的。

方法2.动态变量,因为这是MVC里的一个Action,变通的代价也很高。

我想应该有个比较好的方法。有没有用动态Linq的?

Zigzag | 园豆:70 (初学一级) | 2012-04-26 10:16

@Zigzag: 只能用反射的话,通过查询的方式获取属性值便是最好的方案了。

allUsers.OrderBy(u => u.GetType().GetProperties().Where(p=>p.Name ==order).Single().GetValue(u, null));

当然,为了优化性能,也可以做个变通:

Type type = typeof(User);
PropertyInfo p = type.GetProperties().Where(o=>o.Name==order).Single();
allUsers.OrderBy(u => p.GetValue(u, null));
无之无 | 园豆:5095 (大侠五级) | 2012-04-26 10:29

@笨笨蜗牛: 谢谢您的解答,这主意不错,:)

Zigzag | 园豆:70 (初学一级) | 2012-04-26 12:16

@无之无: 报错,Lambda表达不认得p.GetValue方法

happydaily | 园豆:253 (菜鸟二级) | 2014-03-04 15:36
其他回答(2)
0

构建一个查询表达式,然后再去进行查询

sinhbv | 园豆:2579 (老鸟四级) | 2012-04-26 10:05
1

可以考虑直接传表达式u => u.Name,u => u.id

收获园豆:2
dudu | 园豆:30943 (高人七级) | 2012-04-26 12:00

这么小的问题把园长都引来了。鸡冻啊。谢谢您的回答,暂时我还是反射吧。

支持(0) 反对(0) Zigzag | 园豆:70 (初学一级) | 2012-04-26 12:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册