C# 多个按位标志组合

C# 多个按位标志组合,c#,.net,entity-framework,entity-framework-5,flags,C#,.net,Entity Framework,Entity Framework 5,Flags,我有一个方法,它接受要显示的项的枚举标志参数。数据库中的项可以设置多个标志,传递给方法的值也可以设置多个标志。 例如: 我希望能够将这些值传递给方法,并返回相应的项 如果我通过Flag2 | Flag3,则返回Item2和Item3(因为每个标志都与实体中设置的标志之一相匹配) 如果我通过Flag1,则返回Item1和Item2 ……等等。我一直在试验。在哪里和。任何,我仍然完全不知道如何做到这一点,如果这是可能的话。我的目标是.NET4.5并使用EF5。我相信这是可能的。您的枚举必须设置[

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

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

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

……等等。我一直在试验。在哪里和。任何,我仍然完全不知道如何做到这一点,如果这是可能的话。我的目标是.NET4.5并使用EF5。我相信这是可能的。您的枚举必须设置[Flags]属性,然后它就像.Where(p=>p.Flags==FilterFlags)一样简单


我相信这是可能的。您的枚举必须设置[Flags]属性,然后它就像.Where(p=>p.Flags==FilterFlags)一样简单

R

使用按位运算符

使用按位运算符


我看得不对。对我来说,旗帜更像是一种旗帜。例如:

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

var filteredFlags=dbContext.Topics.Where(i=>(i.Flags&flagsToExclude我看得不对。对我来说,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);

var filteredFlags=dbContext.Topics.Where(i=>(i.Flags&flagsToExclude给定一个MyItems列表,每个MyItems都有MyFlags类型的属性标志:

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;
                }
            }
        }
    }
}
public IEnumerable GetItemsWithFlag(IList项,MyFlags){
var flagsL=Convert.ToUInt64(标志);
foreach(Enum.GetValues中的var值(typeof(MyFlags))){
var valueL=Convert.ToUInt64(值);
如果((flagsL&valueL)=valueL){
foreach(项目中的var项目){
var itemL=Convert.ToUInt64(item.Flags);
如果((项目L&valueL)=valueL){
收益回报项目;
}
}
}
}
}

这将遍历所有可能的标志,如果在参数
flags
中设置了该标志,则返回在
flags
属性中设置了该标志的所有项目,给定一个MyItems列表,每个MyItems都有MyFlags类型的属性标志:

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;
                }
            }
        }
    }
}
public IEnumerable GetItemsWithFlag(IList项,MyFlags){
var flagsL=Convert.ToUInt64(标志);
foreach(Enum.GetValues中的var值(typeof(MyFlags))){
var valueL=Convert.ToUInt64(值);
如果((flagsL&valueL)=valueL){
foreach(项目中的var项目){
var itemL=Convert.ToUInt64(item.Flags);
如果((项目L&valueL)=valueL){
收益回报项目;
}
}
}
}
}

这将遍历所有可能的标志,如果在参数
flags
中设置了该标志,则返回在
flags
属性中设置了该标志的所有项目

什么是Item1类型,Enum?否,Item1,2和3是使用EF设计器创建的类的实例。什么是Item1类型,Enum?否,Item1,2和3是类crea的实例ted与EF设计器。但这将只显示完全匹配的项目。我希望显示项目上设置的任何标志与作为参数给定的任何标志匹配的项目。使用您的方法,如果我传递Flag1 | Flag3,则只返回项目2(而不是项目1),这不是我想要的。这是因为您希望在标记操作中使用&运算符,而不是|,但这将仅显示完全匹配的项。我希望显示项上设置的任何标记与作为参数给定的任何标记匹配的项。使用您的方法,如果我传递Flag1 | Flag3,则只返回项2(而不是项1),这不是我想要的。这是因为您希望在标记操作中使用&运算符,而不是|不是正确的答案,而是感谢指向正确方向的指针。不是正确的答案,而是感谢指向正确方向的指针。应该有一种方法将未回答的答案标记为收藏夹。:)应该有一种方法将未回答的答案标记为收藏夹。:)