![](/img/trans.png)
[英]How to avoid checking particular 'linq where clause' if that value is “any”?
[英]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.