在C#中,我将标记枚举值作为字节存储在数据库中.例如,对于以下Flags枚举:
[Flags] public enum Options { None = 0,First = 1,Second = 2,Third = 4 }
如果我想记录’First’和’Second’,我将其保存为数据库中记录的’options’字段中的’3’字节.
因此,在使用LINQ时,如何检查数据库中的值是否与作为“选项”枚举传递的参数中的“任何”选项匹配,类似于此伪代码:
public static Something(Options optionsToMatch) { db.MyEntity.Get(a => a.options contains any of the options in optionsToMatch);
解决方法
这里的代码通过遍历枚举来完成你想要的东西(我从
here那里得到了答案).
static void Main() { //stand-in for my database var options = new byte[] { 1,2,3,4,1,5 }; var input = (Options)5; //input broken down into a list of individual flags var optional = GetFlags(input).ToList(); //get just the options that match either of the flags (but not the combo flags,see below) var foundOptions = options.Where(x => optional.Contains((Options)x)).ToList(); //foundOptions will have 3 options: 1,1 } static IEnumerable<Enum> GetFlags(Enum input) { foreach (Enum value in Enum.GetValues(input.GetType())) if (input.HasFlag(value)) yield return value; }
编辑
如果您还想在此示例中找到5(选项的组合),只需添加一个额外的或条件,如下所示:
var foundOptions = options.Where(x => optional.Contains((Options)x) || input == (Options)x).ToList();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。