2009-12-02 15 views

Odpowiedz

1

Czy coś takiego jakiś czas temu.

Spróbuj czegoś takiego.

PropertyProjection projection = Projections.Property("t.ID"); 
PropertyProjection property = Projections.Property("n.Namn"); 
ICriteria criteria = session.CreateCriteria<TagRegistration>("t") 
       .CreateCriteria("Tag","n") 
       .Add(
         Restrictions.Gt(
          Projections.SqlProjection("({alias}.ID & 3) as bitWiseResult", new[] { "bitWiseResult" }, new IType[] { NHibernateUtil.Int32 }) 
         , 0) 
        ) 
       .AddOrder(Order.Desc(Projections.Count(projection))) 
       .AddOrder(Order.Asc(property)) 
       .SetProjection(Projections.GroupProperty(projection), Projections.GroupProperty(property)) 

Uwaga ta część {alias} .ID & 3) gdzie wstawiony bezpośrednio wartość, która nie jest bardzo dobra, ale to działa :)

można to zrobić lepiej, jeśli spojrzeć na badania projekt NHibernate NHibernate/kryteria/AddNumberProjection.cs

ale trzeba zrobić, aby powrócić podkwerendzie pełną inicjację Tag myślę, że to zapytanie jest lepiej zrobić w HQL.

Pozdrowienia

14

Oto jak można to zrobić z kryteriami API:

[Flags] 
enum Bar{ 
    A = 0x01, 
    B = 0x02, 
    C = 0x04 
} 

var criteria = this.Session.CreateCriteria<Foo>() 
      .Add(BitwiseFlags.IsSet("Bar", Bar.A | Bar.C)); 

Zastosowanie:

public class BitwiseFlags : LogicalExpression 
{ 
    private BitwiseFlags(string propertyName, object value, string op) : 
     base(new SimpleExpression(propertyName, value, op), 
     Expression.Sql("?", value, NHibernateUtil.Enum(value.GetType()))) 
    { 
    } 

    protected override string Op 
    { 
     get { return "="; } 
    } 

    public static BitwiseFlags IsSet(string propertyName, Enum flags) 
    { 
     return new BitwiseFlags(propertyName, flags, " & "); 
    } 
} 

powinien generować następujące dane wyjściowe, gdy klauzula:

FROM _TABLE 
WHERE (this_.Bar & 5 = 5) 

, które powinny dać ci wiersze, które mają flagi Bar.A i Bar.C set (wyłączając wszystko inne). Powinieneś być w stanie używać go również w połączeniu i rozłączności.

+0

fajny pomysł, chciałbym dodać metodę 'NotSet (..)', która powinna skutkować '(this_.Bar & 5 = 0)', aby zakończyć – Holly

Powiązane problemy