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

时间:2016-05-25 20:33:46

标签: c# lambda linq-expressions sqlite-net

我的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进行数据访问。

我缺少什么才能使谓词正确编译到我的存储库方法?

1 个答案:

答案 0 :(得分:2)

Linq提供商在支持的模式方面存在差异。你的人不承认Guid.Parse。这是EF吗?众所周知,EF无法识别实际可以转换为SQL或在本地进行评估的许多基本.NET Framework功能。

  

我缺少什么

无。除了修补EF或编写自己的代理LINQ提供程序(这是一周的工作)之外,没有办法让EF支持这个。

你需要忍受这个。没有存储库你会遇到同样的问题。你不能用EF写这样的Linq查询。