2011-01-06 41 views
0

У меня есть класс PatientCase, который отображается в таблице PatientCase в базе данных.
У меня есть еще один класс, называемый провайдером, который сопоставляется с таблицей поставщика в базе данных.
класс PatientCase имеет 2 класса как свойства
1) AssignedProvider типа Provider - Карты для AssignedProviderID в PatientCaseTable
2) AncillaryProvider типа Provider - Карты для AncillaryProviderID в PatientCaseTableКак написать критерии в моем случае

ТЕПЕРЬ
Учитывая ProviderID , как я могу фильтровать случае такие объекты, которые

AssignedProviderID = ProviderID 
        OR 
    AncillaryProviderID = ProviderID 

Plz Помоги мне,

+0

Какая версия NHibernate? –

+0

Зачем вам нужны Критерии? Нужно ли быть динамичным? Статические запросы намного проще в HQL. –

ответ

1

Долгий путь классических критериев заключается в следующем:

session 
    .CreateCriteria<PatientCase>() 
    .Add(new Disjunction() 
    .Add(Restrictions.Eq("AssignedProvider", provider)) 
    .Add(Restrictions.Eq("AncillaryProvider", provider))); 

не то, что я использую провайдеру себя в качестве аргумента, а не его Id. Как правило, более «объектно-ориентированное» работает с объектами вместо id. Для того, чтобы использовать идентификаторы, вы можете присоединиться к таблицам:

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); 
0

благодаря Стефана.- Через ваш ответ я узнал больше о критериях. В любом случае, Вот как я решил проблему

caseCriteria.Add(
    Expression.Or(
     Expression.Eq("Provider.Providerid", providerId), 
     Expression.Eq("AncillaryProvider.Providerid", providerId) 
    ) 
); 
Смежные вопросы