传递给存储库方法的表达式未正确编译
Expressions passed down to repository method are not properly compiled
我的 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"))}
以上谓词将抛出异常并显示以下消息
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
class 时引入很多问题。
我正在使用 SQLite.Net-PCL 进行数据访问。
我缺少什么才能使谓词正确编译为我的存储库方法?
Linq 提供程序在支持的模式方面有所不同。你的不认识 Guid.Parse
。这是EF吗?众所周知,EF 无法识别许多实际上可以转换为 SQL 或在本地评估的基本 .NET Framework 功能。
what am I missing
没有。除了修补 EF 或编写您自己的代理 LINQ 提供程序之外,没有其他方法可以使 EF 支持这一点,这需要一周的工作。
你需要忍受这个。如果没有存储库,您会遇到同样的问题。您只是不能使用 EF 编写此类 Linq 查询。
我的 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"))}
以上谓词将抛出异常并显示以下消息
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
class 时引入很多问题。
我正在使用 SQLite.Net-PCL 进行数据访问。
我缺少什么才能使谓词正确编译为我的存储库方法?
Linq 提供程序在支持的模式方面有所不同。你的不认识 Guid.Parse
。这是EF吗?众所周知,EF 无法识别许多实际上可以转换为 SQL 或在本地评估的基本 .NET Framework 功能。
what am I missing
没有。除了修补 EF 或编写您自己的代理 LINQ 提供程序之外,没有其他方法可以使 EF 支持这一点,这需要一周的工作。
你需要忍受这个。如果没有存储库,您会遇到同样的问题。您只是不能使用 EF 编写此类 Linq 查询。