2013-05-08 70 views
0

我有一个代码NHibernate的空查询

if (user != null) 
    query = query.Where(item => item.User.Id == user.Id); 
else if (equipment != null) 
    query = query.Where(item => false);// TODO: Add logic for equipment 

但NHibernate的不能建立表达式树item => false。有一天这个表达式会改变,但现在它必须返回空查询。有没有办法解决这个问题?

+0

'WHERE(1 = 0)'将工作 – stuartd 2013-05-08 15:02:43

+0

@stuartd,没有。同样的例外。 “无法确定从常量,假,System.Linq.Expressions.ConstantExpression” – Max 2013-05-08 15:05:34

+0

成员类型“对不起,我确信我曾经使用过。 – stuartd 2013-05-08 16:04:52

回答

1

假设它是一个IQueryable的用户,试试这个。

if (user != null) 
    query = query.Where(item => item.User.Id == user.Id); 
else if (equipment != null) 
    query = new List<User>().AsQueryable(); 

编辑:

OP说,这是一个IQueryOver不是IQueryiable,看了一眼源和QueryOver受到保护,从而无法看到如何轻松地创建一个空的现在。我的建议是使用LINQ提供程序(如果可以的话),以便我的原始答案能够正常工作。如果这不可能,那么这个UGLY黑客将现在工作。

if (user != null) 
       query = query.Where(item => item.User.Id == user.Id); 
      else if (equipment != null) 
       query = query.Where(item => item.User.Id < 0 && item.User.Id > 1); 
+0

AsQueryable()返回IQueryable对象,但查询是IQueryOver =( – Max 2013-05-08 20:16:39

+0

假设是所有错误的母亲,是不是有没有理由不使用nHibernate的LINQ提供程序?通常要好得多,如果不那么强大。但现在你可以做到这一点if(user!= null) query = query.Where(item => item.User.Id == user.Id); else if(equipment!= null) query = query .Where(item => item.User.Id <0 && item.User.Id> 1); – CountZero 2013-05-08 21:24:35

+0

Thanks!Id是Guid,所以我使用下面的表达式:query = query.Where(item => item.Id == ); – Max 2013-05-09 09:54:24

0

我想我已经用

Where(item => 1 == 0) 
+0

同样的例外:“无法从Constant,False,System.Linq.Expressions.ConstantExpression中确定成员类型”,或许NHibernate用常量计算表达式,所以我们得到了我们的Where(item => false); – Max 2013-05-09 09:58:09