Pergunta

Existe alguma maneira de filtrar minha consulta Nibernate no campo do subtipo antes de chegar ao banco de dados adicionando um ICRITERION à minha execução do DetacedCriteria?

Meu código se parece com o seguinte:

DetachedCriteria detachedCriteria = DetachedCriteria.For(typeof(MyObject));

    ProjectionList projectionList = Projections.ProjectionList();
    projectionList.Add(Projections.SqlProjection("{alias}.SubType as SubType", new string[] { "SubType" }, new IType[] { TypeFactory.GetAnsiStringType(15) }));

    dc.SetProjection(projectionList);
    dc.Add(Expression.Eq("SubType", "MYOBJECT"));

    using(ISession session = ...)

    {

       ICriteria criteria = detachedCriteria.GetExecutableCriteria(session);

    // Blows up because I don't know how to reference the SubType
    // field with an ICriterion (Expression.Eq("SubType", "MYOBJECT"))
       IList list = criteria.List();

    ...

    }

Embora essa possa não ser a maneira certa de atingir meu objetivo, espero que seja pelo menos possível, porque não estou ansioso para ter que refatorar minhas interfaces que esperam / produzem um iCritriorion. Também não tenho necessariamente acesso à sessão em nenhum lugar perto de onde preciso criar o objeto Icriterrion (mas tenho controle total sobre o alias/nomeação dos vários campos/tabelas de Nibernato que serão usados).

Foi útil?

Solução

Demorou um pouco de pesquisando no Google para encontrar a resposta para isso, aqui está:http://derek-says.blogspot.com/2008/08/excluding-particular-erived-types-in.html

   ICriteria crit = sess.CreateCriteria(typeof(Mammal));  
   crit.Add( Expression.Not( Expression.Eq("class", typeof(DomesticCat)) ) );  
   List mammals = crit.List();  
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top