1

我有一个方法,它采用要显示的项目的枚举标志参数。数据库中的项目可以设置多个标志,传递给方法的值也可以设置多个标志。例如:

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

我希望能够将这些值传递给方法并返回相应的项目。

  • 如果我通过 Flag2 | Flag3,返回 Item2 和 Item3(因为每个标志都匹配实体中设置的标志之一)
  • 如果我通过 Flag1,则返回 Item1 和 Item2

...ETC。我一直在尝试 .Where 和 .Any ,如果可能的话,我仍然完全不知道如何做到这一点。我的目标是 .NET 4.5 并使用 EF5。

4

4 回答 4

2

使用按位运算符

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

给定一个 MyItems 列表,其中每个都有一个 MyFlags 类型的属性 Flags:

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) 一样简单

在此处阅读有关枚举标志的更多信息

于 2013-07-31T12:24:00.303 回答
0

我看错了。对我来说,flags 更像是一个 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 回答