我的 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/