0

重複の可能性:
NHibernate に列挙型として格納されているフラグを照会する方法

私は3つのテーブルを持っています- Recipient、、MessageMessageType

MessageType は次のようになります。

| ID | Description  |
|====|==============|
|  1 | JobAlert     |
|  2 | Newsletter   |
|  3 | SpecialOffer |
|  4 | Survey       |

Recipientビットフィールドとして使用される整数列を含みます。受信者は、受信したいメッセージの種類を選択できます。受信者がニュースレターや特別オファーを受け取りたい場合は、ビットフィールドを次のように設定します。(2 ^ 2) | (2 ^ 3)

Messageへの参照が含まれており、次のように定義されているMessageTypeId計算列MessageTypeBitFlagPOWER(2, MessageTypeId)

SQL で表現された私のクエリは次のようになります。

SELECT * FROM Message, Recipient
  WHERE Recipient.MessageTypeBitField & Message.MessageTypeBitFlag > 0

bitfield 列と bitflag 列でビットごとの AND を実行することにより、特定の受信者が関心のあるメッセージのみを簡単に選択できます。

問題は、SQL でこれを行っていないことです。これを、NHibernate Criteria API で構築されたかなりリッチなシステムに追加オプションとして追加する必要があります。

NHibernate API を介してこの基準を表現する方法はありますか? API を使用するか、既存の基準に SQL/HQL 句を追加することによってですか?

4

1 に答える 1

0

OK、これはFiroによって提出されたこのリンクされた投稿に基づく特定の実装です。これを機能させるために少し調整する必要があったためです。

/// <summary>An NHibernate criterion that does bitwise comparison to match a bit flag against a bitmask.</summary>
public class BitMask : LogicalExpression {
    private BitMask(string propertyName, object value, string op) :
        base(new SimpleExpression(propertyName, value, op), Expression.Sql("?", 0, NHibernateUtil.Int64)) {
    }

    protected override string Op {
        get { return ">"; }
    }
    /// <summary>Create a bitwise filter criterion - i.e. one that will be satisified if <code><paramref name="propertyName"/> &amp; <paramref name="bits"/> &gt; 0</code></summary>
    public static BitMask Matches(string propertyName, long bits) {
        return new BitMask(propertyName, bits, " & ");
    }
}

次に、次のように Criteria API を介して使用します。

public IEnumerable<Message> GetMessagesForRecipient(Recipient r) {
    var messages = session.CreateCriteria<Message>()
        .Add(BitMask.Matches("MessageTypeBitFlag ", r.MessageTypeBitField))
        .List<Message>();
    return(messages);
}
于 2012-02-17T12:54:52.320 に答える