如何比较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;
如果有人来到这里search或编译…编译的解决方法:
这是我如何做到这一点。
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();