Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用“日期时间”处理日期时间;“Linq方法”;_C#_Asp.net_Entity Framework - Fatal编程技术网

C# 使用“日期时间”处理日期时间;“Linq方法”;

C# 使用“日期时间”处理日期时间;“Linq方法”;,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,[ASP.NET 4.0/EF 4.1] 嗨 我试图使用“Linq方法”根据datetime字段过滤数据源,但我得到了错误:“在这个上下文中只支持基元类型('如Int32、String和Guid')” 我知道实体框架在处理日期时有一些限制,但我需要的是一些优雅的解决方案来处理这个问题 我的代码是: public IList<Order> GetOrders(int? orderId = null, string customerId = null, int? employee

[ASP.NET 4.0/EF 4.1]

我试图使用“Linq方法”根据datetime字段过滤数据源,但我得到了错误:“在这个上下文中只支持基元类型('如Int32、String和Guid')”

我知道实体框架在处理日期时有一些限制,但我需要的是一些优雅的解决方案来处理这个问题

我的代码是:

    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();
    }
public IList GetOrders(int?orderId=null,string customerId=null,int?employeeId=null,DateTime?orderDateFrom=null,DateTime?orderDateUntil=null,DateTime?requiredDate=null,DateTime?shippedDate=null)
{
可预测的结果;
结果=来自ctx中的订单。订单。包括(“订单详细信息”)
选择订单;
//将筛选器应用于基本查询
if(orderId!=null)
result=result.Where(o=>o.OrderID.Equals(OrderID));
如果(!String.IsNullOrEmpty(customerId))
result=result.Where(o=>o.CustomerID.ToUpper().Equals(CustomerID.ToUpper());
if(employeeId!=null)
结果=结果,其中(o=>o.EmployeeID.Equals(EmployeeID));
if(orderDateFrom!=null)
结果=结果,其中(o=>o.OrderDate>=orderDateFrom);
if(orderDateUntil!=null)
结果=结果,其中(o=>o.OrderDate o.RequiredDate==RequiredDate);
如果(shippedDate!=空)
结果=结果,其中(o=>o.ShippedDate==ShippedDate);
返回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();
    }
public IList GetOrders(int?orderId=null,string customerId=null,int?employeeId=null,DateTime?orderDateFrom=null,DateTime?orderDateUntil=null,DateTime?requiredDate=null,DateTime?shippedDate=null)
{
可预测的结果;
结果=来自ctx中的订单。订单。包括(“订单详细信息”)
选择订单;
//将筛选器应用于基本查询
if(orderId!=null)
result=result.Where(o=>o.OrderID.Equals(OrderID.Value));
如果(!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)
结果=结果,其中(o=>o.OrderDate>=orderDateFrom.Value);
if(orderDateUntil!=null)
结果=结果,其中(o=>o.OrderDate o.RequiredDate==RequiredDate.Value);
如果(shippedDate!=空)
结果=结果,其中(o=>o.ShippedDate==ShippedDate.Value);
返回result.ToList();
}

如果有人有更好的解决方案,请告诉我。

您使用的是可空类型DateTime?在你的例子中。我不确定您的数据库列是否允许NULL,但我会使用
date.Value
传递参数值,以确保EF不会超过它。请注意,对于可为null的类型,可以使用
HasValue
属性检查参数是否包含正确的值。这导致:

if (orderDateFrom.HasValue)
   result = result.Where(o => o.OrderDate >= orderDateFrom.Value);

嗯,一定是4.1版,因为4.0支持这种方式的日期;我们和你一样有日期检查,而且效果很好。你是先使用代码吗?我不记得了,
DateTime.Compare(t1,t2)
在EF linq查询中起作用吗?在EF 4.1中也可以像上面的代码那样比较DateTime。真奇怪。您使用SQL Server吗?还是SQL Server CE版本?或者其他数据库?这看起来更干净,真的。但是与可空类型的比较实际上是有效的,在LINQtoEntities中也是如此。我刚刚测试了所有4种组合(
OrderDate
orderDateFrom
是否为空),并且在我的示例中它一直有效,我从来不用使用
.Value
。谢谢@Bart。这确实是我的错,因为我不能使用像result=result.Where(o=>o.OrderID.Equals(OrderID))这样的表达式。我必须使用表达式result=result.Where(o=>Equals(orderId.Value))。据我所知,问题不仅与DateTime有关(请参见OrderID),还与referenceType的比较有关。@Slauma,您能提供一些代码摘录来证明您的确认吗?Tks@rperson:我现在明白了,当我对可空类型使用
Equals
时,我也确实得到了你的异常。你确定这不是你唯一的问题吗?当您现在从DateTime筛选器中删除
.Value
时,是否也会出现异常?(我的示例与DateTime Where子句中的一个非常相似,只是使用了其他类和属性名。)