Список рассылки <T>в качестве необязательного параметра в теле сообщения в ASP. NET Core Web Api - PullRequest
1 голос
/ 29 мая 2020

У меня была эта модель, которая принимала необязательные параметры для тела почтового запроса:

 public class ReportFilterModel
{

    public int? ReportStatusId { get; set; }
    public Guid? AreaID { get; set; }
}

Это будет выполнять поиск в БД в соответствии с фильтрами, заданными пользователем:

 var report = _context.tbl_Reports.AsQueryable();

                if (model.ReportStatusId.IsNotNull())
                    report = report.Where(x => x.IsDeleted == false && x.ReportStatusId == (StatusEnum)model.ReportStatusId.Value);

                if (model.Area.IsNotNull())
                    report = report.Where(x => x.IsDeleted == false && x.Area.Id == model.AreaId);

И затем он наконец возвращал это:

 finalReports = await report
                    .Where(x => x.IsDeleted == false)
                    .Select(x => new ReportsWithFiltersModel
                    {
                        Id = x.Id,

                        Area = Id,
                        UserId = x.UserId,
                        ReportStatus = x.ReportStatusId.GetEnumDescription(),

                    }).ToListAsync();

Все это работает абсолютно нормально, но теперь я хочу дать список необязательных параметров, например:

public class ReportFilterModel
{

    public List<int>? ReportStatusId { get; set; }
    public List<Guid>? AreaID { get; set; }
}

Это выдача исключения

'List<int>' does not contain a definition for 'Value' and no accessible extension method 'Value' accepting a first argument of type 'List<int>' could be found (are you missing a using directive or an assembly reference?)

Как это исправить?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы смешиваете две концепции типы значений, допускающие значение NULL, и ссылочные типы, допускающие значение NULL, (добавлено в C# 8.0). Типы значений Nullabale, отмеченные ?, в основном являются ярлыками для Nullable<T> и имеют свойство Value. List<T> (в вашем случае List<int> и List<Guid>) является ссылочным типом, и у него нет свойства Value, и пометка его с помощью ? сообщает компилятору, что это свойство может содержать ссылку null и делает его способным для применения правил, гарантирующих, что вы правильно проверили это свойство на наличие нулевой ссылки. Итак, в двух словах, ваши List<int>? ReportStatusId и List<Guid>? AreaID уже «необязательны», а ? сообщает компилятору об этом.

Как исправить это?

Измените

 if (model.ReportStatusId.IsNotNull())
     report = report.Where(x => x.IsDeleted == false && x.ReportStatusId == (StatusEnum)model.ReportStatusId.Value);

на

if (model.ReportStatusId.IsNotNull() && model.ReportStatusId.Any())
     var statuses = model.ReportStatusId.Cast<StatusEnum>().ToList();
     report = report.Where(x => x.IsDeleted == false && statuses.Contains(x.ReportStatusId));
1 голос
/ 29 мая 2020

? Не означает необязательный. Это означает Nullable, где T - тип значения (он применяется к типам значений и делает их допускающими значение NULL).

Типы ссылок, такие как списки, уже допускают значение NULL.

List<int> x = null; //valid version of what you are trying to achieve with List<int>?

int? or Nullable<int> //valid
List<int?> x or List<Nullable<int>> ; //valid
...