c# - 传递给存储库方法的表达式未正确编译

标签 c# lambda linq-expressions sqlite-net

我的 ViewModel 中有以下调用。

Order order= await DataService.Orders.GetAsync(p => p.Id == Guid.Parse("07fafcd9-10db-e511-848d-005056b94716"));

订单存储库具有以下方法。

public async Task<T> GetAsync(Expression<Func<T, bool>> predicate)
{
    return await Db.FindAsync<T>(predicate).ConfigureAwait(false);
}

Db 属性的类型为 SQLiteAsyncConnection。我上面提供的谓词将转换为以下表示。

{p => (p.Id == Parse("07fafcd9-10db-e511-848d-005056b94716"))}

上述谓词将抛出异常并显示以下消息

no such function: parse

因此,我传递了不存在的 Guid.Parse 函数,如果我有以下谓词,则会抛出类似的异常。

Order order= await DataService.Orders.GetAsync(p => p.Id == anotherInstanceObject.Id);

解决方案是用传递实际值替换我的代码。

Guid guid = Guid.Parse("07fafcd9-10db-e511-848d-005056b94716");
Order order= await DataService.Orders.GetAsync(p => p.Id == guid);

但是上面的内容非常违反直觉,并且当开发人员开始使用 DataService 类时会引入很多问题。

我正在使用SQLite.Net-PCL用于我的数据访问。

为了使谓词正确编译为我的存储库方法,我缺少什么?

最佳答案

Linq 提供程序在支持的模式方面有所不同。您的无法识别Guid.Parse。这是EF吗?众所周知,EF 无法识别许多实际上可以转换为 SQL 或在本地评估的基本 .NET Framework 功能。

what am I missing

什么都没有。除了修补 EF 或编写自己的代理 LINQ 提供程序(这需要一周的工作量)之外,没有其他方法可以让 EF 支持此功能。

你需要忍受这一点。如果没有存储库,您也会遇到同样的问题。您无法使用 EF 编写此类 Linq 查询。

关于c# - 传递给存储库方法的表达式未正确编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37447117/

相关文章:

c# - 通过 C# 在单个数据库调用中将大量数据插入 SQL Server

Apache Commons CollectionsUtils.select 的 Java 8 Lambda 替换

c# - 构建执行另一个表达式的表达式

c++ - 使用枚举指定的函数填充 vector

c# - 加入/链接两个表达式

c# - 动态选择器 Linq To Entities

c# - 设置到区域的路由,而无需在 MVC 中的 url 中指定区域名称

javascript - 我需要在 asp 链接按钮上显示表格行

c# - 为什么这不会抛出异常

java - 修改 lambda 封闭范围内定义的数组