[ASP.NET 4.0/4.1 EF]使用 “Linq的方法” 与日期时间处理
嗨,
我正尝试使用 “Linq的方法” 的基础上日期时间字段来过滤数据源,但我收到错误:“在这种情况下只支持原始类型(如Int32,String和Guid)”。
我知道Entity Framework在处理日期时有一些限制,但我需要的是处理这个问题的一些优雅的解决方案。
我的代码是:
public IList<Order> GetOrders(int? orderId = null, string customerId = null, int? employeeId = null, DateTime? orderDateFrom = null, DateTime? orderDateUntil=null, DateTime? requiredDate = null, DateTime? shippedDate = null)
{
IQueryable<Order> result;
result = from order in ctx.Orders.Include("Order_Details")
select order;
// Apply filters to the base query
if (orderId != null)
result = result.Where(o => o.OrderID.Equals(orderId));
if (!String.IsNullOrEmpty(customerId))
result = result.Where(o => o.CustomerID.ToUpper().Equals(customerId.ToUpper()));
if (employeeId != null)
result = result.Where(o => o.EmployeeID.Equals(employeeId));
if (orderDateFrom != null)
result = result.Where(o => o.OrderDate >= orderDateFrom);
if (orderDateUntil != null)
result = result.Where(o => o.OrderDate <= orderDateUntil);
if (requiredDate != null)
result = result.Where(o => o.RequiredDate == requiredDate);
if (shippedDate != null)
result = result.Where(o => o.ShippedDate == shippedDate);
return result.ToList();
}
当代码执行查询(result.ToList()),它抛出异常。如果我删除datetime.Where子句,它工作正常。
谢谢!
解决方案
我已经改变了我的代码:
public IList<Order> GetOrders(int? orderId = null, string customerId = null, int? employeeId = null, DateTime? orderDateFrom = null, DateTime? orderDateUntil=null, DateTime? requiredDate = null, DateTime? shippedDate = null)
{
IQueryable<Order> result;
result = from order in ctx.Orders.Include("Order_Details")
select order;
// Apply filters to the base query
if (orderId != null)
result = result.Where(o => o.OrderID.Equals(orderId.Value));
if (!String.IsNullOrEmpty(customerId))
result = result.Where(o => o.CustomerID.ToUpper() == customerId.ToUpper());
if (employeeId != null)
result = result.Where(o => o.EmployeeID == employeeId.Value);
if (orderDateFrom != null)
result = result.Where(o => o.OrderDate >= orderDateFrom.Value);
if (orderDateUntil != null)
result = result.Where(o => o.OrderDate <= orderDateUntil.Value);
if (requiredDate != null)
result = result.Where(o => o.RequiredDate == requiredDate.Value);
if (shippedDate != null)
result = result.Where(o => o.ShippedDate == shippedDate.Value);
return result.ToList();
}
如果有人有更好的解决方案,请让我知道。
呵呵,必须是4.1的问题,因为4.0支持这种方式的日期;我们有和你一样的日期检查,它工作正常。你是先使用代码吗? – 2011-06-06 15:08:07
我不记得,'DateTime.Compare(t1,t2)'在EF linq查询中工作吗? – FlyingStreudel 2011-06-06 15:10:10
比较上面代码中的日期时间也适用于EF 4.1。真奇怪。你使用SQL Server吗?还是SQL Server CE版本?或者其他一些数据库? – Slauma 2011-06-06 15:13:21