NHibernate 使用带有 WHERE IN 的 QueryOver

Posted

技术标签:

【中文标题】NHibernate 使用带有 WHERE IN 的 QueryOver【英文标题】:NHibernate using QueryOver with WHERE IN 【发布时间】:2011-07-21 11:53:11 【问题描述】:

我会像这样创建一个 QueryOver

SELECT *
FROM Table
WHERE Field IN (1,2,3,4,5)

我尝试过Contains 方法,但遇到了异常

“System.Exception:无法识别的方法调用:System.String:Boolean Contains(System.String)”

这是我的代码

var qOver = _HibSession.QueryOver<MyModel>(() => baseModel)                                                                
  .JoinAlias(() => baseModel.Submodels, () => subModels)
  .Where(() => subModels.ID.Contains(IDsSubModels))
  .List<MyModel>();

【问题讨论】:

你能说明IDsSubModels的定义吗? 【参考方案1】:

我找到了解决办法!! :-)

var qOver = _HibSession.QueryOver<MyModel>(() => baseModel)
    .JoinAlias(() => baseModel.Submodels, () => subModels)
    .WhereRestrictionOn(() => subModels.ID).IsIn(IDsSubModels)
    .List<MyModel>();

【讨论】:

这样更好。WhereRestrictionOn(() => subModels.ID).IsIn(IDsSubModels) Faber,您的评论应该放在您的答案中,因为如果我尝试,.Where(Restrictions.In(subModels.ID,IDsSubModels)) 将不起作用。您的评论确实有效。 如果“IN”查询中的“列表”是对象列表怎么办? 使用 IsIn 获得更简单的语法。【参考方案2】:

你可以试试这样的:

// if IDsSubModels - array of IDs
var qOver = _HibSession.QueryOver<MyModel>() 
                       .Where(x => x.ID.IsIn(IDsSubModels))

在这种情况下你不需要加入

【讨论】:

这将按 MyModel.ID 过滤,而不是像 @Faber 想要的那样按 MyModel.Submodels.ID 过滤,对吧? x 这里是 MyModel 类的实例,与 SQL 请求中 Table 的 instance\record 相同。 SELECT * FROM Table WHERE Field IN (1,2,3,4,5) 并且 (1,2,3) 中的 x.ID 与 (1,2,3) 中的 Table.Field 相同。 1,2,3 是 IDsSubModels【参考方案3】:

这很有效,而且更优雅

var Strings = new List<string>  "string1", "string2" ;

var value = _currentSession
.QueryOver<T>()
.Where(x => x.TProperty == value)
.And(Restrictions.On<T>(y=>y.TProperty).IsIn(Strings))
.OrderBy(x => x.TProperty).Desc.SingleOrDefault();

where T is a Class and TProperty is a property of T

【讨论】:

是的,你是对的!我用过你的语法,但我忘了在这里发布;)

以上是关于NHibernate 使用带有 WHERE IN 的 QueryOver的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate - 如何使用 where 子句保存对象

MySQL 不使用带有 WHERE IN 子句的索引?

带有“WHERE ... IN”查询的 PDO [重复]

Fluent NHibernate Where 子句

Doctrine DBAL - 带有附加参数的 WHERE IN 数组

SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”