SQLite异常:当使用"count"调用OData服务与EntityFramework提供程序时,"没有这样的函数:BigCount"

Var*_*ina 7 c# sqlite wcf entity-framework odata

我在SQLite数据库上使用EF5(使用System.Data.SQLite 1.0.90.0).实体通过OData服务公开

public sealed class MyService : DataService<MyEntities>
Run Code Online (Sandbox Code Playgroud)

当我从我的应用程序内部查询我的实体时,它可以正常工作,例如

using (var ents = new MyEntities) 
{
    var count = ents.SomeEntity.Select(ent => ent).Count();
}
Run Code Online (Sandbox Code Playgroud)

当我从这样的浏览器发送请求时

http://localhost:8737/MyService/SomeEntity
Run Code Online (Sandbox Code Playgroud)

它也工作正常,它返回我的实体列表.

但是当我创建以下请求时

http://localhost:8737/MyService/SomeEntity/$count
Run Code Online (Sandbox Code Playgroud)

要么

我通过一些客户端应用程序的服务引用查询服务(我的查询包含Count()),我得到一个例外

System.Reflection.TargetInvocationException:调用目标抛出了异常.---> System.Data.EntityCommandExecutionException:执行命令定义时发生错误.有关详细信息,请参阅内部异常 ---> System.Data.SQLite.SQLiteException:SQL逻辑错误或缺少数据库
没有这样的函数:BigCount

我想当生成SQL请求时,它包含SQLite没有的聚合函数BIGCOUNT.如果我将我的数据库提供程序更改为SQL Server,那么一切都很好.我不知道如何改变请求的生成方式.我试图切换到Entity Framework 6 + System.Data.SQLite 1.0.94.0但它没用.我试图坚持EF5并将System.Data.SQLite的版本更改为以前的版本,但没有任何改变.我唯一的区别是,当我使用EF6 + SQLITE1.0.94.0时,我早期的问题是"解决"(引用因为我不会称之为我不理解的解决方案).

更新23/12/2014

我们通过检查System.Data.SQLite源,找到错误使用"bigcount"关键字的位置,根据我们的需要修复它,然后重建库来解决了这个问题.

如前所述这里的BigCount应该被编译为COUNT()除了SQL Server的所有数据库.看起来BigCount只是编译为BigCount,或者像那样.

重建图书馆本身变得很棘手,因为我只是一个小小的,所以我的团队负责人做了那部分,我不能告诉细节,我没有时间深入研究.至少,这是你可以用来解决同样问题的方向.

Ram*_* A. 1

我也遇到了该错误SQL logic error or missing database\r\nno such function: BigCount,以下是我用于更新代码以解决 Windows 操作系统上的问题的详细分步说明:

  1. 下载fossil并将fossil.exe解压到你的<working>目录

  2. 打开普通命令提示符

  3. 跑步cd <working>

  4. 跑步fossil clone https://system.data.sqlite.org/ sds.fossil

  5. 跑步fossil open sds.fossil

  6. 跑步fossil update <release-tag>

    例如,fossil update release-1.0.105.2

  7. 更新.\System.Data.SQLite.Linq\SQL Generation\SqlGenerator.cs
    ​ 取消注释行 1978 - 1983
    b. 将 1982 行替换为以下行:

    aggregateResult.Append("COUNT");

  8. 跑步cd Setup

  9. 跑步set_YYYY.bat

    例如,要构建 net451 二进制文件,请运行set_2013.bat

  10. 跑步build.bat ReleaseManagedOnly

  11. 删除对ASP.NET Web 项目的引用System.Data.SQLite.Linq以及从 ASP.NET Web 项目中删除引用System.Data.SQLite.EF6

  12. 在 ASP.NET Web 项目中添加对 newSystem.Data.SQLite.Linq.dllSystem.Data.SQLite.EF6.dllfrom的引用<working>\bin\2013\Release\bin

资料来源:

System.Data.SQLite 源代码
System.Data.SQLite 构建过程
System.Data.SQLite 票证 UUID 76c2eaadc0297696b2c5fb10d41a22325f56f9b9