Jak przekonwertować to do CriteraQuery:HQL do CriteriaQuery przy użyciu operatory bitowe
select n
from TagRegistration t
join t.Tag n
where t.Status & :status > 0
order by count(t.ID) desc
, n.Name asc
Jak przekonwertować to do CriteraQuery:HQL do CriteriaQuery przy użyciu operatory bitowe
select n
from TagRegistration t
join t.Tag n
where t.Status & :status > 0
order by count(t.ID) desc
, n.Name asc
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
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.
fajny pomysł, chciałbym dodać metodę 'NotSet (..)', która powinna skutkować '(this_.Bar & 5 = 0)', aby zakończyć – Holly