2009-12-02 5 views

Antwort

1

Did wie etwas, das vor einer Weile.

Versuchen Sie etwas wie das.

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

Hinweis: dieser Teil {alias} .ID & 3), wo ich den Wert direkt eingefügt, das ist nicht sehr gut, aber es funktioniert :)

Sie könnten es besser machen, wenn man sich den Test aussehen Projekt von NHibernate Nhibernate/Kriterien/AddNumberProjection.cs

Aber Sie brauchen eine Unterabfrage zu tun vollständig initialisierten Tag ich denke, diese Abfrage besser zurückzukehren ist in HQL zu tun.

Grüße

14

Hier ist, wie Sie es mit den Kriterien API tun könnte:

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

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

mit:

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, " & "); 
    } 
} 

sollte die folgende Ausgabe erzeugen where-Klausel:

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

, die Ihnen Reihen geben sollte, die Fahnen Bar.A und Bar.C gesetzt haben (ausschließlich alles andere). Sie sollten es auch mit Verbindung und Disjunktion verwenden können.

+0

nette Idee, würde ich eine Methode 'NotSet (..)' hinzufügen, die in '(This_.Bar & 5 = 0)' ergeben sollte, um es abzuschließen – Holly