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 子句保存对象