【问题标题】:NHibernate QueryOver Subjective Where?NHibernate QueryOver 主观在哪里?
【发布时间】:2014-02-19 15:09:51
【问题描述】:

所以在 SQL 中我可以编写这样的查询:

SELECT
  A,
  B,
  C
FROM
  myTABLE
WHERE
  (@X is NULL OR A = @X) AND
  (@Y is NULL OR B = @Y) AND
  (@Z is NULL OR C = @Z)

为了创建单个查询,如果没有指定过滤参数,则返回所有条目,如果指定了任何过滤参数,则返回子集。但是我将如何使用 Nhibernate 的 QueryOver 来做这件事呢?我什至不完全确定如何使用 QueryOvery 进行 OR...

【问题讨论】:

  • 请先阅读:nhforge.org/doc/nh/en/…(16.2. 简单表达式)。有所有的答案。如果仍然存在任何问题,请展示您到目前为止所做的工作......我相信您会在这里获得帮助;)
  • 感谢您的链接。所以基本上看来我无法根据参数(如快捷方式)进行过滤,只能根据列进行过滤。所以我需要使用单独的语句来执行此操作,如下所示: 'code' var qry = session.QueryOver(); if (!String.IsNullOrEmpty(A)) { qry.Where(x => x.a == A); } if (!String.IsNullOrEmpty(B)) { qry.Where(x => x.b == B); } if (!String.IsNullOrEmpty(C)) { qry.Where(x => x.c == C); } List fileList = qry.List().ToList();
  • var qry = session.QueryOver<obj>(); if (!String.IsNullOrEmpty(A)) { qry.Where(x => x.a == A); } if (!String.IsNullOrEmpty(B)) { qry.Where(x => x.b == B); } if (!String.IsNullOrEmpty(C)) { qry.Where(x => x.c == C); } List<obj> data = qry.List<obj>().ToList();
  • 我想说,这正是我们所需要的。因为,评估是在应用程序端完成的——无需将其传递给 SQL。换句话说,这个生成的代码 sn-p 正是正确的(如果不是最好的)方法!干得好,先生;)
  • 您在评论中发布的内容是执行此操作的最佳方式。您应该将其添加为答案并接受它,以便将来对人们有所帮助。

标签: sql nhibernate queryover


【解决方案1】:

为了主观查询(基于参数),可接受的方法是分段构建where子句:

var qry = session.QueryOver<obj>(); 
if (!String.IsNullOrEmpty(A)) { qry.Where(x => x.a == A); } 
if (!String.IsNullOrEmpty(B)) { qry.Where(x => x.b == B); } 
if (!String.IsNullOrEmpty(C)) { qry.Where(x => x.c == C); } 
List<obj> data = qry.List<obj>().ToList();

因此最终结果是针对给定参数集运行的确切查询,而不是原始帖子中指定的通用 SQL 查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多