Как я могу получить значение месяца Datetimeoffset? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть список данных, которые имеют datetimeoffset? как колонна внутри. Я хочу получить конкретные c данные, в которых есть месяц, который я хочу, но не знаю как. Ниже приведен код, который я пробовал.

Это возвращает меня с ошибкой No overload for method 'Tostring', что странно, поскольку я могу передать datetimeoffset? и использовать его в другой функции, но если я делаю это непосредственно внутри того места, где я его получаю, я не могу его использовать.

      int d = DateTime.Now.Month;
      string f = d.ToString();
      var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.ToString("MM") == f);
      return Json(s);

Это возвращает нуль

      int d = DateTime.Now.Month;
      string f = d.ToString();
      var s = _dbContext.Documents.FirstOrDefault(x => x.ApplyDate.Value.ToString("MM") == f);
      return Json(s);

Ответы [ 3 ]

0 голосов
/ 18 марта 2020

DateTimeOffset? имеет тип Nullable, поэтому не имеет перегрузки ToString(string format), как DateTimeOffset имеет.

, чтобы получить значение месяца из DateTimeOffset?, которое вы можете

  1. x.ApplyDate.Value.ToString("MM")
  2. x.ApplyDate.Value.Month

пожалуйста, учтите, что вы можете проверить, является ли ApplyDate.Value нулевым до того, как получит свой месяц свойство

0 голосов
/ 18 марта 2020

В приведенном выше коде отображается DateTime, а не DateTimeOffSet.

DateTimeOffSet имеет значение Struct, и если у вас есть значение nullable , вам необходимо сначала проверить значение, а затем получить месяц от значения части

DateTimeOffSet myNullableDateTime = someValue...//

Вариант 1:

// notice I added value below

myNullableDateTime.HasValue? "?Month="+myNullableDateTime.EscapeDataString(myNullableDateTime.Value.ToString()):"")

Вариант 2:

if(myNullableDateTime.HasValue)
 {
    var Month = myNullableDateTime.Month
    TimeSpan difference = DateTimeOffset.Now.Subtract(myNullableDateTime.Value);
    // convert the difference to what you need and get Month 
 }

У меня нет скомпилировал его, но он должен получить ответ или довольно близко.

0 голосов
/ 18 марта 2020

Вы можете получить месяц смещаемого значения datetimeoffset следующим образом:

DateTimeOffset? dt;
dt?.Value.Month;

Однако мне действительно интересно, сможет ли EF перевести это:

x => x.ApplyDate?.Month == f

в SQL выражение. Я полагаю, что это откат к фильтрации в памяти. Кроме того, даже если EF сможет перевести это в выражение SQL, оно не будет оптимальным, поскольку индексы, которые могут быть определены в этом столбце, не будут использоваться.

Поэтому я бы Предложите переписать выражение LINQ примерно так:

x :> x.ApplyDate != null && x.ApplyDate >= new DateTimeOffset(someDate.Year, someDate.Month, 1) && x.ApplyDate <= new DateTimeOffset(someDate.Year, someDate.Month, daysInMonth)

(Если вы хотите получить данные, которые относятся к определенному c месяцу в указанном c году. Если вы хотите получить записи, которые относятся к определенному месяцу, независимо от года, я не вижу другого варианта)

...