【问题标题】:Adding dynamic SQL query to QueryOver向 QueryOver 添加动态 SQL 查询
【发布时间】:2013-04-21 09:28:51
【问题描述】:

我有以下适合我的查询:

IList<info> result = 
QueryOver<info>()
.Where(row => row.Timestamp >= fromDate)
.And(row => row.Timestamp <= toDate)
.OrderBy(row => row.Timestamp).Asc
.Skip(startRow).Take(count).List();

我需要通过从客户端获取附加 SQL 查询字符串并将其添加到我的查询中来扩展它,如下所示:

    IList<info> result = 
        QueryOver<info>()
        .Where(row => row.Timestamp >= fromDate)
        .And(queryString)
        .And(row => row.Timestamp <= toDate)
        .OrderBy(row => row.Timestamp).Asc
        .Skip(startRow).Take(count).List();

string queryString = "AND name='haim' And number=1"

是否可以在动态查询字符串中添加 QueryOver?

【问题讨论】:

  • 你为什么要这样做?

标签: nhibernate queryover dynamic-queries


【解决方案1】:

我怀疑这是开箱即用的。但是通过一些调整你可以做到这一点

  1. QueryOver&lt;&gt; 中获取 SQL。按照接受的答案this question
  2. 将它与客户端发送的 sql 连接
  3. 使用 NH 运行纯 SQL。请参阅this question 接受的答案,了解如何执行此操作

【讨论】:

    【解决方案2】:

    简短的回答是你可以:

    string queryString = "name='haim' And number=1";
    var query = Session.QueryOver<info>().And(NHibernate.Criterion.Expression.Sql(queryString));
    

    只要你保持注入的查询字符串简短而简单,你就可以了。 如果您希望这个注入的字符串也改变查询语义(例如需要连接),我建议不要这样做;这不值得麻烦。

    【讨论】:

      【解决方案3】:

      我要在这里补充一点,在其他地方生成 sql 并将其发送到执行不是一个好习惯。我知道在类中抽象 WHERE 场景可能很困难,但使用 NET4 处理动态类要快得多。

      所以我说这是不好的做法,因为您没有将查询封装在单个层中。你应该。

      可怕的后果显然是这两个部分之间缺乏牢固的关系,导致这是一个非常脆弱的解决方案。如果其中一个发生更改,您需要知道另一个需要更新,依此类推。一两个开发团队是可以的,但大团队会因此受到伤害。

      只要我的两分钱。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多