Linq表达式在异常情况下在查询解析器中失败

时间:2018-08-06 15:56:09

标签: c# sql entity-framework linq asp.net-web-api

一段时间以来,我一直无法弄清这个错误,希望有人能提供一些见解。首先,我将说明条件,然后再说明不会/不会发生错误的条件。

我有一个Web api,它有两个端点/ api / getData1和/ api / getData2

我有一个Web客户端,它向/ api / getData1发出请求 我还有另一个向api / getData2

发出请求的应用程序

getData1和getData2的Web API控制器最终都对dataService.getData(DateTime date)进行了服务调用

dataService.getData(DateTime日期)调用StaticFilterClass.buildFilter(DateTime日期)

StaticFilterClass.buildFilter(DateTime日期)

        AlarmFilter filter = null;

        var paramExpr = Expression.Parameter(typeof(Alarm), "a");
        var fieldRef = Expression.Property(paramExpr, "UtcEnd");
        var binaryExpression = Expression.And(
                    Expression.GreaterThanOrEqual(fieldRef, Expression.Constant(earliestEnd.Date.Add(new TimeSpan(0, 0, 0)).ToUniversalTime(), typeof(DateTime))),
                    Expression.LessThanOrEqual(fieldRef, Expression.Constant(latestEnd.Date.Add(new TimeSpan(23, 59, 59)).ToUniversalTime(), typeof(DateTime))));
        filter = (AlarmFilter)Expression.Lambda(binaryExpression, paramExpr);

dataService.getData(DateTime日期),在获取过滤器之后

dbAlarms = tenantDb.Alarms.Where(completeFilter)?.ToList() ?? dbAlarms;

上面的行有条件地抛出

"The query view generated for the EntitySet 'Alarms' is not valid. The query parser threw the following error : The argument type 'Edm.String' is not compatible with the property 'UtcEnd' of formal type 'Edm.DateTime'. Near member access expression, line 3, column 77.."}

现在,这行引发错误的条件使我感到困惑。

启动Web api时,如果我的Web客户端转到/ api / getData1,则没有错误。从Web客户端到/ api / getData1的后续调用成功 ,从另一个应用程序到/ api / getData2的后续调用成功。

启动Web api时,如果我的其他应用程序首先进入/ api / getData2,则会生成上述错误。从应用程序对/ api / getData2的后续调用和从Web客户端对/ api / getData1的后续调用

有人可以帮我指出正确的方向吗?

编辑: 它似乎与数据库项目.dll的加载顺序有关(由客户端应用和api引用)。我将几个数据库事务从客户端应用程序(直接访问数据库的位置)移到了Web api中,因此api将成为命中数据库的第一件事,因为无论如何它都更有意义。仍然不确定根本原因,但这可以解决问题。

1 个答案:

答案 0 :(得分:0)

我只能认为2种: 1)您需要指定一个where返回对象,如下所示:

bAlarms = tenantDb.Alarms.Where<MyReturnObject>(completeFilter)?.ToList<MyReturnObject>() ?? dbAlarms;

2)在“警报”内部有一个静态类/函数,getData1和Getdata2可同时访问该类/函数。