繁体   English   中英

如何使用 Linq where 子句在属性中包含任何枚举值

[英]How to include any enum value in property with Linq where clause

我在下面有这个 Linq 语句,其中 calendarParams.RegisteredType 是一个可为空的 int。 在倒数第二行中,如果没有值,我将值设置为 null,如果值为 null,我如何将其设置为任何(枚举)值?

var registrants = await _dbContext.Registrants
    .Where(p => p.EventDate.Month == calendarParams.Date.Month 
        && p.EventDate.Year == calendarParams.Date.Year 
        && p.UserId == userId 
        && (p.RegistrantType == (calendarParams.RegisteredType.HasValue ? (RegistrantType)calendarParams.RegisteredType : null)))
    .ToListAsync();

据我了解,您不能在 LinQ 内部这样做,因为它不接受任何类型的集成功能或结构。 所以对我来说更简单的方法是克服 LinQ 之外的问题

int? myvalue = calendarParams.RegisteredType.HasValue ? (RegistrantType)calendarParams.RegisteredType : null;

var registrants = await _dbContext.Registrants
    .Where(p => p.EventDate.Month == calendarParams.Date.Month 
        && p.EventDate.Year == calendarParams.Date.Year 
        && p.UserId == userId 
        && p.RegistrantType == myvalue)
    .ToListAsync();

顺便说一句,我不明白你在做什么“HasValue”检查默认值是否为空。 但我做的完全一样,只是为了说明原理。

我想出了我需要做什么。 这是我的答案。

var query = _dbContext.Registrants
       .Where(p => p.EventDate.Month == calendarParams.Date.Month && p.EventDate.Year == calendarParams.Date.Year && p.UserId == userId)
       .Select(f => f);

        if (calendarParams.RegisteredType.HasValue) {
            query = query.Where(p =>  p.RegistrantType == (RegistrantType)calendarParams.RegisteredType);
        }

        var registrants = await query.ToListAsync();

如果我正确理解您的意图,您也可以将原始表达式中的倒数第二行更改为以下内容:

&& (!calendarParams.RegisteredType.HasValue || p.RegistrantType == (RegistrantType)calendarParams.RegisteredType))

如果calendarParams.RegisteredType没有值(--> 谓词的第一部分为true ),它只是跳过p.RegistrantType == (RegistrantType)calendarParams.RegisteredType过滤步骤。

为了更清楚,也许您可​​以将第一个表达式分配给一个变量:

var allowAllTypes = !calendarParams.RegisteredType.HasValue;

var registrants = await _dbContext.Registrants
    .Where(p => p.EventDate.Month == calendarParams.Date.Month 
        && p.EventDate.Year == calendarParams.Date.Year 
        && p.UserId == userId 
        && (allowAllTypes || p.RegistrantType == (RegistrantType)calendarParams.RegisteredType))
    .ToListAsync();

暂无
暂无

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

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