簡體   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