使用带有WHERE IN的QueryOver的NHibernate

Fab*_*ber 47 c# nhibernate where-in queryover

我会像这样创建一个QueryOver

SELECT *
FROM Table
WHERE Field IN (1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

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

"System.Exception:无法识别的方法调用:System.String:Boolean包含(System.String)"

在这里我的代码

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

Fab*_*ber 61

我找到了解决方案!! :-)

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

  • 以这种方式更好.WhereRestrictionOn(()=> subModels.ID).IsIn(IDsSubModels) (67认同)

Art*_*m G 49

你可以尝试这样的事情:

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

在这种情况下,您不需要加入

  • 这将按MyModel.ID过滤,而不是按@Faber想要的MyModel.Submodels.ID过滤,对吧? (3认同)

Arn*_*old 11

这工作,更优雅

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
Run Code Online (Sandbox Code Playgroud)