首页 新闻 会员 周边

Linq表达式树问题

0
悬赏园豆:10 [已解决问题] 解决于 2012-06-21 00:12

大家好。自己写了一个方法

public IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> expression)

 

调用

Get( u => u.name == "test");

 

现在我有好几个条件,如 username,date,type。。并且当条件为空时不作为查询条件

这个时候应该如何拼接这个Expression, 如何调用Get(expression);

不夜橙的主页 不夜橙 | 菜鸟二级 | 园豆:253
提问于:2012-06-20 14:41
< >
分享
最佳答案
-1

这个表达式如果不生成SQL,那简单:

Get(u=>(u.name != null && u.name == "test") &&(或者||) (u.type != nul && u.type == "type"))

假如,想变成SQL 。。。。那么就难度大点,需要自己构造一个Expression,因为上面我写的表达式可能在生成SQL的时候有问题。

参考:关于Expression<Func<T, TResult>>

收获园豆:10
无之无 | 大侠五级 |园豆:5095 | 2012-06-20 15:29

嗯。是生成sql。。

现在的做法是在方法里面

var q = _repository.Table;
            if (!string.IsNullOrEmpty(username))
            {
                q = q.Where(i => i.username == username);
            }

这样的话,每次参数都要方法里面。参数经常变,维护性就差了。不知道如何在外面构造这个表达式~~

不夜橙 | 园豆:253 (菜鸟二级) | 2012-06-20 17:13

@sdf333: 我给你的那个连接就支持这个动态构建EXPRESSION。

参考那个做,肯定不会有问题,只是会复杂点。

 

另外一个方案是:检测所有可能条件,对每个可能都单独生成表达式:

Expression<Func<TEntity, bool>> exp;

if(!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(type) && !string.IsNullOrEmpty(date))

{

    exp = u=>u.name == name && u.type == type && u.date == date;

}

else if(!string.IsNullOrEmpty(name) && !string.IsNullOrEmpty(type))

{

    exp = u=>u.name == name && u.type == type;

}

//...后面还有很多。这个方案虽然能达到目的,显然是不可行的。但可以做个简单的简化。

无之无 | 园豆:5095 (大侠五级) | 2012-06-20 17:19

@笨笨蜗牛: 

非常感谢

不夜橙 | 园豆:253 (菜鸟二级) | 2012-06-21 00:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册