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

时间:2011-04-30 10:24:33

标签: linq entity-framework entity-framework-4 invalidoperationexception

我已经使用了EF一段时间,但我从未遇到过这个问题。基本上我们有一个WCF服务,为Web前端提供数据。在该服务中,我们使用EF 4作为数据实现。绕过所有存储库和单例,一个简单的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;
}

orderId,orderStatus&amp; orderType在参数中传递 正如预期的那样,代码可以毫无问题地工作......直到我们运行一些压力测试,我们同时从不同的客户端调用服务(即GET功能)。几分钟后,我们得到一堆 InvalidOperationException:从实体化的'System.Int32'类型到'System.Boolean'类型的指定强制转换无效。在我们的SQL 2008数据库中,OrderID是int(identity,auto-gen),OrderFlag是唯一一个数据类型为bit的字段(由EF翻译为boolean)。
在调试期间,我发现当查询中的单个项目转换为Order时,query.Any()或foreach子句抛出异常。但是,如果我通过任何方式触摸事务(在SSMS上运行相同的查询或在Watch窗口中执行query.Any()),查询将获得适当的数据更新,它只是工作.... 我们的环境:VS 2010,.Net框架4,EF 4,SQL Server 2008快递+标准(我试过两个)
任何评论或任何帮助将不胜感激...
埃里克

1 个答案:

答案 0 :(得分:3)

您应该首先将代码修改为:

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();
}

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