Как мне преобразовать varchar (20) в SQL Server в datetime в C #? - PullRequest
0 голосов
/ 22 октября 2019

Я храню даты в SQL Server как varchar, поэтому они становятся строками в C # в Entity Framework.

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

В SQL Server:

CREATE TABLE [dbo].[Achievements]
(
      ...   
      [DatePerformance] [VARCHAR](20) NULL, 
)

Дата сохраняется в этом формате: «25/04/2019»

В C #:

public static School_LPEntities db = new School_LPEntities();

Я пытался:

List<Achievements> res = db.Achievements.Where(x =>  DateTime.Parse(x.DatePerformance) <= DateTime.Today.Date).ToList();

и:

List<Achievements> res = db.Achievements.Where(x =>   DateTime.ParseExact(x.DatePerformance, "dd/MM/yyyy",
 CultureInfo.InvariantCulture) <= DateTime.Today.Date).ToList();

Код выдает:

System.NotSupportedException: «LINQ to Entities не распознает метод» System. DateTime Parse (System.String) ', и этот метод нельзя преобразовать в выражение хранилища.'

1 Ответ

1 голос
/ 22 октября 2019

Как уже говорили другие в комментариях, количество веских причин хранить ваши даты как varchar в SQL равно нулю.

Вы сказали:

, поэтому они становятся строками в C # в Entity Framework

Как только вы получите дату в C #, вы можете сделать это легко в любом случае сa .ToString().

Но ... что касается вашей конкретной ошибки, то она говорит вам, что вы не можете использовать этот метод внутри оператора Entity Framework LINQ. Лучше всего рассматривать операторы LINQ как запросы. Потому что, на самом деле, он должен быть в состоянии преобразовать ваш оператор LINQ в реальный запрос SQL. Вы не можете использовать DateTime.Parse() внутри SQL-запроса, поэтому он выдает эту ошибку.

Если вы действительно ДОЛЖНЫ хранить свои даты как varchar в базе данных (и опять же, это ужасная идея), тогда яЯ не вижу действительно простого решения. Исходя из этого, я бы сказал вам сначала создать список, а затем просмотреть его:

List<Achievements> res = db.Achievements.ToList();

Затем:

foreach (var achievement in res)
{
   if (DateTime.Parse(achievement.DatePerformance)  <= DateTime.Today.Date)
   {
       // do something here
   }
}

Но это действительно неуклюжий способ обойтиреальное решение: просто сохраните ваши даты как даты !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...