繁体   English   中英

linq-To-Sql:使用枚举(标志)过滤

[英]linq-To-Sql: filter with enum(flags)

我有一个枚举:

[Flags]
public enum EmailType
{
    PasswordRecovery = 1,
    Activation = 2,
    SendTicket = 4
}

例如,在一个表中,我们的值等于 3,这意味着 - PasswordRecoveryActivation 这是我的查询:

var emailType = EmailType.PasswordRecovery;
return Database.EmailSettings.FirstOrDefault(es => es.EmailType ==  (int)emailType);

当然这个查询不能正常工作: 3 == 1 => false 如何正确过滤?
谢谢。

更新:我正在使用Flags属性,因为还有一个使用 XAF(devexpress 框架)编写的应用程序,并且我在 UI 中有一个需要Flags属性的功能。

int emailType = (int)EmailType.PasswordRecovery;
return Database.EmailSettings.FirstOrDefault(es => (es.EmailType & emailType) == emailType);

编辑:我添加了一个演员,因为es.EmailType是和int

Database.EmailSettings.FirstOrDefault(
    es => es.EmailType.HasFlag(EmailType.PasswordRecovery));

我认为EmailType == 3是你的条件之一? 也许您可以先使用其他条件得到结果,然后使用Enum.HasFlag方法在C#代码中使用此条件进行过滤。 如果这是您要查询的唯一条件,也许您可​​以在DB中存储“1,2”而不是“3”。

我一直在寻找使用multiple enum values过滤数据的解决方案,但我没有得到任何好的解决方案。 然后我通过下面提到的解决方案进行了探索:

这是枚举:

[Flags]
public enum TransmissionType
{
    None = 0,
    Automatic = 1,
    CVT = 2,
    DCT = 4,
    Manual = 8,
    SemiAutomatic = 16,
    SportAT = 32,
    Unspecified = 64
}

这是我们使用multiple enum values过滤cars列表的代码

if (input?.Filter?.Transmissions.Count() > 0)
{
     var transmissionTypes = new List<TransmissionType>();
     foreach (var item in input?.Filter?.Transmissions)
     {
         transmissionTypes.Add((TransmissionType) 
              Enum.Parse(typeof(TransmissionType), item, true));
     }
     cars = cars.Where(d => transmissionTypes.Contains(d.Transmission));

 }

这里的汽车是来自 dbContext 和input?.Filter?.Transmissions包含多个枚举值作为字符串数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM