#asp.net-mvc #linq-to-entities #leap-year #entity-functions
#asp.net-mvc #linq-to-entities #високосный год #объект-функции
Вопрос:
Когда у меня в базе данных есть високосный год (например, 29 февраля 2012). Функции EntityFunctions.Функции CreateDateTime выдают System.Data.SqlClient.SqlException: Conversion failed when converting date and/or time from character string.
Мой код выглядит следующим образом в моем asp.net приложение mvc (C #):
from u in _entities.tt_Users
let _start_date = u.Start_Date
let _startDate = _start_date.Day
let _startmonth = _start_date.Month
let _startyear = _start_date.Year
let _starthour = u.Start_Time.Value.Hours
let _startminutes = u.Start_Time.Value.Minutes
let _startseconds = u.Start_Time.Value.Seconds
let _startDateWithTime = EntityFunctions.CreateDateTime(_startyear, _startmonth, _startDate, _starthour, _startminutes, _startseconds)
let _startDateWithZeroTime = EntityFunctions.CreateDateTime(_startyear, _startmonth, _startDate, 0, 0, 0)
let _start_datetime = u.Is_Include_Time ? _startDateWithZeroTime : _startDateWithTime
let _end_date = u.End_Date
let _endDate = _end_date.Day
let _endmonth = _end_date.Month
let _endyear = _end_date.Year
let _endhour = u.End_Time.Value.Hours
let _endminutes = u.End_Time.Value.Minutes
let _endseconds = u.End_Time.Value.Seconds
let _endDateWithTime = EntityFunctions.CreateDateTime(_endyear, _endmonth, _endDate, _endhour, _endminutes, _endseconds)
let _endDateWithZeroTime = EntityFunctions.CreateDateTime(_endyear, _endmonth, _endDate, 0, 0, 0)
let _end_datetime = u.Is_Include_Time ? _endDateWithZeroTime : _endDateWithTime
let _cur_Start_date = u.Is_Include_Time ? _userStartDate : _gMTStartDate
let _cur_End_date = u.Is_Include_Time ? _userEndDate : _gMTEndDate
where u.User_Id == 1 amp;amp; !u.Is_Deleted
amp;amp; _start_datetime >= _cur_Start_date amp;amp; _end_datetime <= _cur_End_date
select new
{
u.User_id,
u.User_Name,
u.Login_Name,
u.Email_Address
};
Здесь _userStartDate, _userEndDate, _gMTStartDate и _gMTEndDate являются параметрами из моей функции.
Если столбец «Is_Include_Time» равен true, то я должен также включить TimeSpan из таблицы. Но для високосного года это выдает ошибку.
Есть предложения?
Ответ №1:
Я только что столкнулся с той же проблемой. У меня есть некоторые значения в строках базы данных, которые мне нужно преобразовать в datetime. Я обнаружил, что могу использовать следующую конструкцию:
DateTime startDate = new DateTime(1, 1, 1);
var counters = from counter in entities.Counter
let date = SqlFunctions.DateAdd("day", counter.DayOfMonth-1, SqlFunctions.DateAdd("month", counter.Month-1, SqlFunctions.DateAdd("year", counter.Year-1, startDate)))
where date >= dateFrom amp;amp; date <= dateTo
orderby date
select new
{
Value = counter.CounterValue,
Date = date
};
Я не уверен в влиянии на производительность, но это работает.
С наилучшими пожеланиями, Tor-Odd
Ответ №2:
попробуйте использовать объявленную переменную вне выражения linq, как я предложил здесь
Комментарии:
1. В моем случае это не сработает, потому что мне нужно сравнить с датой и временем в базе данных. Есть другие альтернативы?
Ответ №3:
Вот как я справляюсь с
var minDate = Convert.ToDateTime("1900-01-01 00:00:00");
return source.Where(x => EntityFunctions.DiffDays(x.ReviewedDate, minDate) > 0).ToList();