【问题标题】:NHibernate using QueryOver with WHERE INNHibernate 使用带有 WHERE IN 的 QueryOver
【发布时间】: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的定义吗?

标签: c# nhibernate queryover where-in


【解决方案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

【讨论】:

  • 是的,你是对的!我用过你的语法,但我忘了在这里发布;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多