2013-08-08 1 views
2

Я пытаюсь получить все @events, где есть FiscalYear.id в IList<int> years. Я использую any() но бросает следующее сообщение об ошибке: StackTraceИспользование любого, чтобы проверить список в NHibernate

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 => [email protected] && 
     @event.EventType.Id == eventTypeId && 
     years.Any(y => y == @event.FiscalYear.Id)) 
} 

ответ

0

Попробуйте использовать метод Contains вместо:

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

Или построить ограничения в долгом пути, используя IsIn:

IList<Domain.Event> results = session 
    .QueryOver<Event>() 
    .Where(e => [email protected] && @event.EventType.Id == eventTypeId) 
    .And(Restrictions.On<Event>(@event => @event.FiscalYear.Id) 
        .IsIn(years.ToArray())) 
    .ToList(); 
+0

Использования содержит броски ту же ошибку – Mike

+0

получил эту ошибку прямо сейчас: 'The лучшего перегруженный метод матч для«NHibernate.Criterion.Lambda.LambdaRestrictionBuilder .IsIn (System.Collections.ICollection) 'имеет некоторые недопустимые аргументы \t ' – Mike

+0

@Mike Okay Я некоторое время был в тупике, пока не понял, что' List 'реализует' ICollection', но 'IList ' не делает. Если вы измените свой параметр 'years' на' List 'или' int [] ', или если вы просто назовете' years.ToList() 'или' years.ToArray() ', он должен работать. –

-1

Вы можете попробовать это:

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

Вы извлекаете все записи из базы данных. Это плохая практика. –

1

Похоже, вы пытаетесь использовать метод Linq в QueryOver. Это не поддерживается. Попробуйте использовать поставщику Linq вместо:

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

IList<Domain.Event> results = 
    session.Query<Event>() 
     .Where(@event => [email protected] && 
     @event.EventType.Id == eventTypeId && 
     years.Any(y => y == @event.FiscalYear.Id)) 
} 
1

Я также столкнулся с тем же сообщением об исключении

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

при использовании IqueryOver с Содержит метод

Ex: 
var departmentTypesArray = criteria.DepartmentTypes.ToArray(); 
qover = qover.Where(p => departmentTypesArray.Contains(p.DepartmentType)); 

, когда я проверить базу данных, я не» t есть записи в таблице, которые я делаю.

, когда я изменил мой запрос с ограничениями, то это работает для меня

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