1

表示する項目の列挙型フラグ パラメーターを取るメソッドがあります。データベース内のアイテムには複数のフラグを設定でき、メソッドに渡される値にも複数のフラグを設定できます。例えば:

Item1 = Flag1
Item2 = Flag1 | Flag3
Item3 = Flag2 | Flag3

これらの値をメソッドに渡して、対応するアイテムを返してもらいたいです。

  • Flag2 | を渡すと Flag3、Item2 と Item3 を返します (各フラグはエンティティに設定されたフラグの 1 つと一致するため)
  • Flag1 を渡すと、Item1 と Item2 が返されます

...等。私は .Where と .Any を試してきましたが、これが可能であるとしても、これを行う方法がまったくわかりません。私は.NET 4.5をターゲットにしており、EF5を使用しています。

4

4 に答える 4

2

ビットごとのAnd演算子を使用する

MyFlags value = MyFlags.Flag2 | MyFlags.Flag3;

MyFlags item1 = MyFlags.Flag1;
MyFlags item2 = MyFlags.Flag1 | MyFlags.Flag3;
MyFlags item3 = MyFlags.Flag2 | MyFlags.Flag3;

bool matchItem1 = (value & item1) > 0; //false
bool matchItem2 = (value & item2) > 0; //true
bool matchItem3 = (value & item3) > 0; //true

[Flags]
enum MyFlags
{
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4
}
于 2013-07-31T12:28:12.183 に答える
1

それぞれ MyFlags 型のプロパティ Flags を持つ MyItems のリストがあるとします。

public IEnumerable<MyItem> GetItemsWithFlag(IList<MyItem> items, MyFlags flags) {
    var flagsL = Convert.ToUInt64(flags);

    foreach (var value in Enum.GetValues(typeof(MyFlags))) {
        var valueL = Convert.ToUInt64(value);

        if ((flagsL & valueL) == valueL) {
            foreach (var item in items) {
                var itemL = Convert.ToUInt64(item.Flags);

                if ((itemL & valueL) == valueL) {
                    yield return item;
                }
            }
        }
    }
}

これは、可能なすべてのフラグをループし、フラグがパラメータに設定されている場合は、そのフラグがプロパティflagsに設定されているすべてのアイテムを返しますFlags

于 2013-07-31T12:51:56.300 に答える
0

それは可能だと思います。Enum には [Flags] 属性が設定されている必要があり、それは .Where(p=>p.Flags == FilterFlags) のように単純です。

Enumフラグの詳細については、こちらをご覧ください

于 2013-07-31T12:24:00.303 に答える
0

私はこれを間違った方法で見ていました。私にとって、フラグは FlagsToExclude のようなものでした。例えば:

[Flags]
public enum ForumTopicFlags : int
{
    None = 0,
    Sticky = 1,
    Spam = 2,
    Deleted = 4
}

デフォルトのフラグは です0。モデレーターの場合、パラメーターとして渡す必要がありnullますが、これは DAL によって無視され、すべてが返されます。標準ユーザーの場合、次Spam | Deletedのように比較して除外される を渡すことができます。

var filteredFlags = dbContext.Topics.Where(i => (i.Flags & flagsToExclude <= 0);
于 2013-07-31T12:44:29.347 に答える