我的ViewModel中有以下调用。
Order order= await DataService.Orders.GetAsync(p => p.Id == Guid.Parse("07fafcd9-10db-e511-848d-005056b94716"));
Orders存储库具有以下方法。
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"))}
上述谓词将使用以下消息抛出异常
没有这样的功能:解析
所以我将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进行数据访问。
我缺少什么才能使谓词正确编译到我的存储库方法?
答案 0 :(得分:2)
Linq提供商在支持的模式方面存在差异。你的人不承认Guid.Parse
。这是EF吗?众所周知,EF无法识别实际可以转换为SQL或在本地进行评估的许多基本.NET Framework功能。
我缺少什么
无。除了修补EF或编写自己的代理LINQ提供程序(这是一周的工作)之外,没有办法让EF支持这个。
你需要忍受这个。没有存储库你会遇到同样的问题。你不能用EF写这样的Linq查询。