EF4-Linq-Query.Any()上的异常

EF4-Linq-Query.Any()上的异常,linq,entity-framework,entity-framework-4,invalidoperationexception,Linq,Entity Framework,Entity Framework 4,Invalidoperationexception,我使用EF已经有一段时间了,但我从来没有遇到过这个问题。基本上,我们有一个为web前端提供数据的WCF服务。在该服务中,我们使用EF4作为数据实现。绕过所有存储库和单例,一个简单的Get函数如下所示: using (OurEntities DataContext = new OurEntities()) { DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking; List<Ord

我使用EF已经有一段时间了,但我从来没有遇到过这个问题。基本上,我们有一个为web前端提供数据的WCF服务。在该服务中,我们使用EF4作为数据实现。绕过所有存储库和单例,一个简单的Get函数如下所示:

using (OurEntities DataContext = new OurEntities())
{
    DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    List<Order> orders = new List<Order>();
    var query = from p in DataContext.Order.Include("OrderDetail")
                where (p.OrderID == orderId || orderId == 0)
                   && (p.OrderStatus == orderStatus || orderStatus == 0)
                   && (p.OrderType == orderType || orderType == 0)
                   && (p.OrderFlag == null || p.OrderFlag == false)
                select p;

    if (query.Any())
    {
        foreach (Order order in query)
        {
            orders.Add(order);
        }
    }
    return orders;
}
使用(OurEntities DataContext=new OurEntities())
{
DataContext.Order.MergeOption=System.Data.Objects.MergeOption.NoTracking;
列表顺序=新列表();
var query=来自DataContext.Order.Include(“OrderDetail”)中的p
其中(p.OrderID==OrderID | | OrderID==0)
&&(p.OrderStatus==OrderStatus | | OrderStatus==0)
&&(p.OrderType==OrderType | | OrderType==0)
&&(p.OrderFlag==null | | p.OrderFlag==false)
选择p;
if(query.Any())
{
foreach(查询中的订单)
{
订单。添加(订单);
}
}
退货订单;
}
orderId、orderStatus和orderType在参数中传递。
正如预期的那样,代码工作没有任何问题。。。直到我们运行一些压力测试,同时从不同的客户端调用服务(即GET函数)。几分钟后,我们得到一堆InvalidOperationException:从物化的“System.Int32”类型到“System.Boolean”类型的指定强制转换无效。在我们的SQL 2008数据库中,OrderID是int(identity,auto-gen),OrderFlag是唯一一个数据类型为bit(通过EF转换为boolean)的字段
在调试期间,我发现该异常要么是由query.Any()抛出的,要么是由foreach子句抛出的,当查询中的单个项按顺序进行转换时。但是,如果我通过任何方式(在SSM上运行相同的查询或在“监视”窗口中执行query.any())来触摸事务,查询将使用正确的数据进行更新,它将正常工作。…
我们的环境:VS 2010、.Net framework 4、EF 4、SQL Server 2008 express+标准(我已经在这两个平台上进行了尝试)
如有任何意见或帮助,将不胜感激……

Eric

您应该从修改代码开始:

using (OurEntities DataContext = new OurEntities())
{
    DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    var query = from p in DataContext.Order.Include("OrderDetail")
                where (p.OrderID == orderId || orderId == 0)
                   && (p.OrderStatus == orderStatus || orderStatus == 0)
                   && (p.OrderType == orderType || orderType == 0)
                   && (p.OrderFlag == null || p.OrderFlag == false)
                select p;

    return query.ToList();
}

然后再次运行测试。我不认为这会解决您的问题,但您当前的代码不应该通过代码审查

您应该从修改代码开始:

using (OurEntities DataContext = new OurEntities())
{
    DataContext.Order.MergeOption = System.Data.Objects.MergeOption.NoTracking;
    var query = from p in DataContext.Order.Include("OrderDetail")
                where (p.OrderID == orderId || orderId == 0)
                   && (p.OrderStatus == orderStatus || orderStatus == 0)
                   && (p.OrderType == orderType || orderType == 0)
                   && (p.OrderFlag == null || p.OrderFlag == false)
                select p;

    return query.ToList();
}

然后再次运行测试。我不认为这会解决您的问题,但您当前的代码不应该通过代码审查

查询的全部含义是什么?除了要执行两次之外,还有其他的
吗?首先,建议每个线程使用一个DataContext,不要在线程之间共享它们。你的情况就是这样吗?(我猜是的,但只是以防万一)。其次,据我所知,Order和OrderDetail上的任何属性都可能产生此错误。此外,当OrderDetail表没有对应订单记录的记录时,可能会出现wierdness。OrderDetail类中是否有布尔值?@Ladislav Mrnka:是的,查询。任何值在这里都没有多大意义,但我相信这与OP的问题无关。
query的全部含义是什么。除了执行两次之外,任何值都是
?首先,建议每个线程使用一个DataContext,不要在线程之间共享它们。你的情况就是这样吗?(我猜是的,但只是以防万一)。其次,据我所知,Order和OrderDetail上的任何属性都可能产生此错误。此外,当OrderDetail表没有对应订单记录的记录时,可能会出现wierdness。OrderDetail类中是否有布尔值?@Ladislav Mrnka:是的,查询。任何值在这里都没有多大意义,但我相信这与OP的问题无关。+1。特别是在第一次调用.Any之后,然后枚举查询将导致两次db往返。实际上,这是我们的原始代码,但在query.ToList()中再次失败。。。。这就是为什么我想在调用ToList()之前检查Any(),只是为了见鬼…+1。特别是在第一次调用.Any之后,然后枚举查询将导致两次db往返。实际上,这是我们的原始代码,但在query.ToList()中再次失败。。。。这就是为什么我想在调用ToList()之前检查Any(),只是为了见鬼。。。