0

我有以下对我有用的查询:

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 动态查询字符串?

4

3 回答 3

1

简短的回答是您可以:

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

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

于 2014-03-22T16:56:26.530 回答
1

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

  1. 从您的QueryOver<>. 按照这个问题的公认答案
  2. 将它与客户端发送的 sql 连接起来
  3. 使用 NH 运行纯 SQL。有关如何执行此操作,请参阅此问题的已接受答案
于 2013-04-21T10:04:06.310 回答
0

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

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

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

只是我的两分钱。

于 2014-03-21T15:58:12.320 回答