使用Any来检查NHibernate中的列表

时间:2013-08-08 20:50:42

标签: asp.net-mvc-3 linq nhibernate ilist

我正在努力让FiscalYear.idIList<int> years的所有@events获得。我正在使用any(),但它抛出以下stacktrace错误:

 Unrecognised method call: 
 System.Linq.Enumerable:Boolean Any[TSource](System.Collections.Generic.IEnumerable`1[TSource], System.Func`2[TSource,System.Boolean])

任何想法?这是代码:

FindAllPaged(int eventTypeId, IList<int> aors, IList<int> years)
{

IList<Domain.Event> results =
    session.QueryOver<Event>()
      .Where(@event => !@event.IsDeleted && 
      @event.EventType.Id == eventTypeId &&
      years.Any(y => y == @event.FiscalYear.Id))
}

4 个答案:

答案 0 :(得分:1)

看起来您正试图在QueryOver中使用Linq方法。这不受支持。请尝试使用Linq提供程序:

FindAllPaged(int eventTypeId, IList<int> aors, IList<int> years)
{

IList<Domain.Event> results =
    session.Query<Event>()
      .Where(@event => !@event.IsDeleted && 
      @event.EventType.Id == eventTypeId &&
      years.Any(y => y == @event.FiscalYear.Id))
}

答案 1 :(得分:1)

我也遇到了同样的异常消息

  

无法识别的方法调用:    System.Linq.Enumerable:Boolean任何[TSource](System.Collections.Generic.IEnumerable 1[TSource], System.Func 2 [TSource,System.Boolean])

将IqueryOver与Contains方法

一起使用时
 Ex: 
var departmentTypesArray = criteria.DepartmentTypes.ToArray();
qover = qover.Where(p => departmentTypesArray.Contains(p.DepartmentType));

当我检查数据库时,我在查询表中没有任何记录。

当我使用限制更改我的查询时,它适用于我

qover = qover.WhereRestrictionOn(p => .DepartmentType).IsIn(departmentTypesArray);

答案 2 :(得分:0)

请尝试使用Contains方法:

IList<Domain.Event> results = session
    .QueryOver<Event>()
    .Where(e => !@event.IsDeleted && 
        @event.EventType.Id == eventTypeId &&
        years.Contains(@event.FiscalYear.Id))
    .ToList();

或者使用IsIn

来构建限制
IList<Domain.Event> results = session
    .QueryOver<Event>()
    .Where(e => !@event.IsDeleted && @event.EventType.Id == eventTypeId)
    .And(Restrictions.On<Event>(@event => @event.FiscalYear.Id)
                     .IsIn(years.ToArray()))
    .ToList();

答案 3 :(得分:-1)

你可以试试这个:

IList<Domain.Event> results = session.QueryOver<Event>().ToList().FindAll(e => !e.IsDeleted && e.Id.Equals(eventTypeId) && years.Contains(e.FiscalYear.Id))