5

データベースにうるう年がある場合 (例: 2012 年 2 月 29 日)。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 && !u.Is_Deleted
&& _start_datetime >= _cur_Start_date && _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 を含める必要があります。しかし、うるう年にはエラーが発生します。

助言がありますか?

4

3 に答える 3

2

同じ問題が発生しました。日時に変換する必要があるデータベース行にいくつかの値があります。次の構成を使用できることがわかりました。

            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 && date <= dateTo
                           orderby date
                           select new
                           {
                               Value = counter.CounterValue,
                               Date = date
                           };

パフォーマンスへの影響はわかりませんが、機能します。

よろしく、 Tor-Odd

于 2012-03-05T12:30:36.810 に答える
0

これが私が対処する方法です

var minDate = Convert.ToDateTime("1900-01-01 00:00:00");
return source.Where(x => EntityFunctions.DiffDays(x.ReviewedDate, minDate) > 0).ToList();
于 2012-05-25T04:33:00.337 に答える
0

ここで提案したように、宣言された変数をlinq式の外で使用してみてください

于 2012-02-29T11:47:29.467 に答える