如何比较date组件中的date时间在EF?

我有两个date值,一个已经存储在数据库中,另一个用户使用DatePickerselect。 用例是从数据库中search特定的date。

之前在数据库中input的值始终具有时间部分为12:00:00,其中从select器input的date具有不同的时间分量。

我只对date组件感兴趣,并且希望忽略时间组件。

在C#中做这种比较的方法是什么?

另外,如何在LINQ中做到这一点?

更新:在LINQ to实体,以下工作正常。

e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0 

注意:在写这个答案的时候,EF关系不清楚(在写完这个问题后,这个问题被编辑进了问题)。 为了正确的方法使用EF,检查Mandeeps答案 。


您可以使用DateTime.Date属性执行仅date比较。

 DateTime a = GetFirstDate(); DateTime b = GetSecondDate(); if (a.Date.Equals(b.Date)) { // the dates are equal } 

使用EntityFunctions类修剪时间部分。

 using System.Data.Objects; var bla = (from log in context.Contacts where EntityFunctions.TruncateTime(log.ModifiedDate) == EntityFunctions.TruncateTime(today.Date) select log).FirstOrDefault(); 

资料来源: http : //social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

UPDATE

从EF 6.0及更高版本开始,EntityFunctions被replace为DbFunctions 。

我认为这可以帮助你。

我做了一个扩展,因为我必须比较充满EF数据的存储库中的date,所以.Date不是一个选项,因为它没有在LinqToEntities转换中实现。

这里是代码:

  /// <summary> /// Check if two dates are same /// </summary> /// <typeparam name="TElement">Type</typeparam> /// <param name="valueSelector">date field</param> /// <param name="value">date compared</param> /// <returns>bool</returns> public Expression<Func<TElement, bool>> IsSameDate<TElement>(Expression<Func<TElement, DateTime>> valueSelector, DateTime value) { ParameterExpression p = valueSelector.Parameters.Single(); var antes = Expression.GreaterThanOrEqual(valueSelector.Body, Expression.Constant(value.Date, typeof(DateTime))); var despues = Expression.LessThan(valueSelector.Body, Expression.Constant(value.AddDays(1).Date, typeof(DateTime))); Expression body = Expression.And(antes, despues); return Expression.Lambda<Func<TElement, bool>>(body, p); } 

那么你可以这样使用它。

  var today = DateTime.Now; var todayPosts = from t in turnos.Where(IsSameDate<Turno>(t => t.MyDate, today)) select t); 

如果您使用数据库实体的Date属性,您将得到例外:

 "The specified type member 'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported." 

你可以使用这样的东西:

  DateTime date = DateTime.Now.Date; var result = from client in context.clients where client.BirthDate >= date && client.BirthDate < date.AddDays(1) select client; 

要在LINQ to Entities中做到这一点,你必须使用支持的方法 :

 var year = someDate.Year; var month = ... var q = from r in Context.Records where Microsoft.VisualBasic.DateAndTime.Year(r.SomeDate) == year && // month and day 

丑陋,但它的工作原理,并在数据库服务器上完成。

这里有一个不同的方法,但只有在SecondDate是一个你传入的variables时才有用:

 DateTime startDate = SecondDate.Date; DateTime endDate = startDate.AddDays(1).AddTicks(-1); ... e => e.FirstDate.Value >= startDate && e.FirstDate.Value <= endDate 

我认为这应该工作

你也可以使用这个:

DbFunctions.DiffDays(date1, date2) == 0

只是总是比较DateTime的Date属性,而不是全date时间。

当你进行LINQ查询时,在查询中使用date.Date,即:

 var results = from c in collection where c.Date == myDateTime.Date select c; 

这是我如何做到这一点。

 DateTime date_time_to_compare = DateTime.Now; //Compare only date parts context.YourObject.FirstOrDefault(r => EntityFunctions.TruncateTime(r.date) == EntityFunctions.TruncateTime(date_to_compare)); 

// Linq用户/编码器的注意事项

这应该给你一个确切的比较来检查一个date是否落在范围之内,当处理用户的dateselect器的input时,例如:

 ((DateTime)ri.RequestX.DateSatisfied).Date >= startdate.Date && ((DateTime)ri.RequestX.DateSatisfied).Date <= enddate.Date 

startdate和enddate是来自dateselect器的值。

您可以在下面的用户链接比较2date没有时间:

 private bool DateGreaterOrEqual(DateTime dt1, DateTime dt2) { return DateTime.Compare(dt1.Date, dt2.Date) >= 0; } private bool DateLessOrEqual(DateTime dt1, DateTime dt2) { return DateTime.Compare(dt1.Date, dt2.Date) <= 0; } 

比较函数返回3个不同的值:-1 0 1这意味着dt1> dt2,dt1 = dt2,dt1

你可以使用DbFunctions.TruncateTime()方法。

 e => DbFunctions.TruncateTime(e.FirstDate.Value) == DbFunctions.TruncateTime(SecondDate); 

没有时间比尝试像这样:

 TimeSpan ts = new TimeSpan(23, 59, 59); toDate = toDate.Add(ts); List<AuditLog> resultLogs = _dbContext.AuditLogs .Where(al => al.Log_Date >= fromDate && al.Log_Date <= toDate) .ToList(); return resultLogs; 

试试这个…它可以很好地比较两个DateTimestypes之间的date属性:

PS。 这是一个权宜之计,而且是一个非常糟糕的做法,当你知道数据库可以带上数千条logging的时候,永远不要使用它。

 query = query.ToList() .Where(x => x.FirstDate.Date == SecondDate.Date) .AsQueryable();