LINQ to NHibernate: выбор объекта, который имеет конкретный объект в ассоциации «один ко многим»

Я хотел бы сделать этот запрос:

Session.Linq<User>().Where(u => u.Payments.Count(p => p.Date != null) > 0);

Говоря простым языком, я хочу получить всех пользователей, у которых есть хотя бы один платеж с указанной датой.

Когда я запускаю пример кода, я получаю System.ArgumentException с сообщением:

System.ArgumentException: не удалось найти соответствующего поставщика информации о критериях: this.Id = sub.Id

Вы знаете решение этой проблемы?

Также было бы очень полезно, если бы кто-то мог предоставить тот же запрос с помощью NHibernate Query by Criteria API.


person knut    schedule 13.08.2010    source источник
comment
Может быть полезно, если вы выложили свою карту + модели для Пользователя и Платежей....   -  person DanP    schedule 13.08.2010


Ответы (2)


Я не уверен, что это сработает в вашем конкретном случае, но я бы использовал расширение .Any(), чтобы немного очистить запрос linq; Например:

Session.Linq<User>().Where(u => u.Payments.Any(p => p.Date != null));
person DanP    schedule 13.08.2010

Я думаю что-то вроде этого:

Customer customerAlias = null; 
criteria = CurrentSession.CreateCriteria(typeof(User), () => customerAlias);
if (searchCriteria.OrdersNumber.HasValue)
{
     ICriteria paymentsCriteria = criteria.CreateCriteria<Customer>(x => x.Payments);

     DetachedCriteria paymentsCount = DetachedCriteria.For<Payment>();
     paymentsCount.SetProjection(Projections.RowCount());
     paymentsCount.Add(SqlExpression.NotNull<Payment>(x => x.Date));
     paymentsCount.Add<Payment>(x => x.Customer.Id == customerAlias.Id);

     paymentsCriteria.Add(Subqueries.Gt(1, paymentsCount));
 }

 return criteria.List<User>();
person Sly    schedule 13.08.2010