Долгий путь классических критериев следующий:
session
.CreateCriteria<PatientCase>()
.Add(new Disjunction()
.Add(Restrictions.Eq("AssignedProvider", provider))
.Add(Restrictions.Eq("AncillaryProvider", provider)));
не то чтобы я использовал сам провайдер в качестве аргумента, а не его идентификатор. Как правило, это более «объектно-ориентированный», чтобы работать с сущностями, а не с идентификатором. Чтобы использовать идентификаторы, вы можете присоединиться к таблицам:
session
.CreateCriteria<PatientCase>()
.CreateCriteria("AssignedProvider", "assigned")
.CreateCriteria("AncillaryProvider", "ancillary")
.Add(new Disjunction()
.Add(Restrictions.Eq("assigned.Id", providerId))
.Add(Restrictions.Eq("ancillary", providerId)));
Существуют более простые и удобочитаемые синтаксисы, по крайней мере, в NH 3.0 (например, QueryOver).
Это также проще сделать с помощью HQL:
session
.CreateQuery(
@"select case from PatientCase case
where case.AssignedProvider = :provider
or case.AncillaryProvider = :provider")
.SetEntity("provider", provider);