不支持Linq-to-EF DateTime.ToLocalTime

时间:2012-05-03 11:50:54

标签: c# sql linq datetime linq-to-entities

Linq to EF不支持

DateTime.ToLocalTime

有什么替代方案?我的想法已经不合时宜了。

7 个答案:

答案 0 :(得分:6)

不要在Linq查询中使用.ToLocalTime(),而是在参数的查询之外使用相反的转换。

var dateUniversal = dateParam.ToUniversalTime();

var query = myTable.Where( t => t.DateTime > dateUniversal );

答案 1 :(得分:0)

我使用了Extensions的组合,并依赖于从我的应用程序的前端传递的值在LocalTime中。所以,如果我有两个日期时间..比如...报告的开始日期和结束日期参数,我会把它们放在那里..让用户在LocalTime中提交..然后在我的控制器的后端部分..我在我的Linq to Entities Query中使用sdate和edate变量。我将静态扩展方法放入静态助手类中。对不起,我迟到了一年多。 :)

    DateTime sdate = CalcHelper.AbsoluteStart(model.StartDate);
    DateTime edate = CalcHelper.AbsoluteEnd(model.EndDate);

    public static DateTime AbsoluteStart(this DateTime dateTime)
    {
        return dateTime.Date.ToUniversalTime();
    }
    public static DateTime AbsoluteEnd(this DateTime dateTime)
    {
        return AbsoluteStart(dateTime).AddDays(1).AddTicks(-1).ToUniversalTime();
    }

答案 2 :(得分:0)

您可以尝试这样:

var promotions = _promotionService.GetAll(
            x => (DbFunctions.TruncateTime(x.CreatedDate.Value) >= viewModel.GTXFromDate.Date)
            && (DbFunctions.TruncateTime(x.CreatedDate.Value) <= viewModel.GTXToDate.Date));

答案 3 :(得分:-1)

通常,您应该在数据库中以UTC格式存储日期和时间。

在将代码存储到数据库中之前,将代码中的任何本地日期/时间转换为UTC。

同样,如果您需要在数据库中显示UTC的本地时间,请在数据库提取后将其转换为代码。

答案 4 :(得分:-1)

如果从服务器获得时区偏移量,则可以使用EntityFunctions在linq查询中应用偏移量

var offset = TimeZoneInfo.Local.BaseUtcOffset.TotalMinutes;
var result = db.Dates.Where(a => 
             EntityFunctions.DiffDays(EntityFunctions.AddMinutes(a.Date, offset), DateTime.Now) == 0);

答案 5 :(得分:-1)

将DateTime转换为字符串进行比较,例如:

const string DATE_FORMAT = "yyyy/MM/dd";
var query = sampleTable.Where(x => x.DateTime.ToString(DATE_FORMAT) > DateTime.Now.ToString(DATE_FORMAT));

答案 6 :(得分:-2)

在此question

上找到解决方案
public partial class Person { 

  partial void OnLoaded() { 
    this._BirthDate = DateTime.SpecifyKind(this._BirthDate, DateTimeKind.Utc); 
  } 
}