Как написать критерий запроса при наличии <any>ассоциации - PullRequest
2 голосов
/ 30 апреля 2010

У меня возникли проблемы с созданием правильных критериев для выполнения конкретного запроса - после полудня после консультации с профессором Google я надеюсь, что кто-то может указать мне правильное направление.

У меня есть две сущности интереса: OutputTsDef и NamedAttribute

Я пытаюсь найти все OutputTsDef, которые имеют конкретное значение NamedAttribute.

Я могу написать отдельный критерий, чтобы найти все NamedAttributes, которые имеют имя и значение:

       var attributesCriteria
           = DetachedCriteria.For<INamedAttribute>()
               .Add(Expression.Eq("Name", "some name"))
               .Add(Expression.Eq("Value", "some value"));

Как мне вставить это в запрос для OutputTsDef, чтобы ограничить результаты?

       var criteria
           = nHibernateSession.CreateCriteria(typeof(IOutputTsDefEntity));
       // What do I write here?
       var results = criteria.List();

NamedAttribute выглядит так - обратите внимание на использование [Any], как мы можем иметь NamedAttributes на многих видах сущностей.

[AttributeIdentifier("DbKey", Name = "Id.Column", Value = "NamedAttributeID")]
[Class(Table = "NamedAttributes")]
public class NamedAttribute : BusinessEntity, INamedAttribute
{
    [Any(0, Name = "Entity", MetaType = "System.String", IdType = "System.Int32")]
    [MetaValue(1, Class = "Sample.OutputTsDef, Sample.Entities", Value = "OTD")]
    [MetaValue(2, Class = "Sample.OutputTimeSeriesAttributesEntity, Sample.Entities", Value = "OTA")]
    [Column(3, Name = "OwnerType")]
    [Column(4, Name = "OwnerKey")]
    public virtual IBusinessEntity Entity { get; set; }

   [Property(Column = "Name")]
   public virtual string Name { get; set; }

   [Property(Column = "Value")]
   public virtual string Value { get; set; }

   ... omitted ...

}

В обычном SQL я бы просто включил дополнительное предложение where:

where OutputTsDefId
      in ( select distinct OwnerKey
           from NamedAttributes
           where Name = ?
             and Value = ?
             and OwnerType = 'OTD' )

Чего мне не хватает?

(Вопрос также размещен в списке рассылки NHUsers - здесь я скопирую любую полезную информацию.)

Ответы [ 2 ]

0 голосов
/ 04 мая 2010

Это то, что я в итоге сделал - встроил проверку подзапроса SQL следующим образом:

const string subquery
    = "{alias}.OutputTsDefId in "
        +"( select OwnerKey "
        + " from NamedAttributes na "
        + " where na.Name = ? and na.Value = ? and OwnerType='OTD')";
criteria.Add(
    Expression.Sql(
        subquery,
        new object[] { attributeFilter.Name, attributeFilter.Value },
        new IType[] { NHibernateUtil.String, NHibernateUtil.String }));

Это не идеально - я не очень люблю проходить мимо NHibernate таким образом. Но он выполняет свою работу, которая имеет большое значение.

Я все еще заинтересован в поиске чистого решения NHibernate, если оно есть.

0 голосов
/ 01 мая 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...