Форматирование строки DateTime внутри оператора linq - PullRequest
1 голос
/ 11 марта 2019

У меня есть настроенный веб-интерфейс, в котором я отображаю информацию на своем сайте через структуру сущностей. Я фильтрую свои данные, чтобы получить только те части, которые мне нужны, включая значение DateTime.

[HttpGet]
public IEnumerable<Log> XmlLog()
{
   var userLog = _db.Logs.Where(x => x.EngineType == "Xml");

   return userLog .ToList();
 }

Это отображает мою дату как:

2019-02-05T15:11:50.39

Что мне нужно сделать, так это изменить формат DateTime на другой. В идеале: Saturday 2 February 9:12:30

На моем linq-звонке я пробовал следующее:

[HttpGet]
public IEnumerable<Log> XmlLog()
{
   var userLog = _db.Logs.Select(d => d.LogDate.ToString("f")).Where(x => x.EngineType == "Xml");

   return userLog .ToList();
 }

А на самой моей модели я попробовал следующие атрибуты:

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:yyyy/MM/dd HH:mm:ss}")]
public DateTime LogDate { get; set; }

Ни одна из моих попыток не сработала. Что я делаю не так в своих высказываниях?

Выше написано в DotNet 4.7, а не в DotNetCore.

1 Ответ

2 голосов
/ 11 марта 2019

Как прокомментировал Джон , ваш LINQ должен вызывать исключение, потому что вы сначала выбираете строки, а затем пытаетесь фильтровать их, как будто они являются объектами.

Но этот подход в любом случае обратный. Это просто получение данных, поэтому оно должно оставаться без изменений, без какого-либо форматирования. Пусть ваш слой представления будет отвечать за форматирование.

Атрибут DisplayFormat великолепен, но только если вы используете Html.DisplayFor / Html.EditorFor помощников. Если вы делаете что-то наподобие @Model.LogDate, подумайте над тем, чтобы вызвать ToString(format) в нужном вам формате.

Наконец, ваш формат не похож на пример, который вы хотели бы видеть. Правильный формат, который вы ищете: dddd, dd MMMM HH:mm:ss.

В общем, оставьте фильтр как есть, и либо используйте DisplayFor с этой аннотацией:

[DataType(DataType.DateTime)]
[DisplayFormat(DataFormatString = "{0:dddd, dd MMMM HH:mm:ss}")]
public DateTime LogDate { get; set; }

...

@Html.DisplayFor(m => m[i].LogDate)

Или не беспокойтесь о каких-либо аннотациях, просто используйте

@Model[i].LogDate.ToString("dddd, dd MMMM HH:mm:ss")
...