我目前正在爲我的ASP.VNext應用程序實現repository pattern。我希望這些方法是異步和可過濾的。所以我設計了下面的接口方法:爲什麼在EF7中爲謂詞使用參數時無法使用ToListAsync()?
Task<TEntity> GetOneAsync(Func<TEntity,bool> predicate);
,並想實現像這樣(有私人的DbContext實例ctx
):
public async Task<MyEntity> GetOneAsync(Func<MyEntity,bool> predicate)
{
// compiler error
return await ctx.MyEntities.Where(predicate).FirstOrDefaultAsync();
}
但是我只能用FirstOrDefaultAsync()
硬編碼時謂詞如下:
return await ctx.MyEntites.Where(e => e.Id == 1).FirstOrDefaultAsync();
在傳遞謂詞我只得到FirstOrDefault()
沒有async選項,所以爲了讓我的方法的異步I必須寫
public async Task<MyEntity> GetOneAsync(Func<MyEntity,bool> predicate)
{
//save to a local variable to prevent calling a disposed DbContext
var entities = await Task.Run(() => ctx.Contracts.Where(predicate).FirstOrDefault());
return entities;
}
我有一個關於這兩個問題:
爲什麼傳遞謂詞時無法訪問
FirstOrDefaultAsync()
方法?我的解決方案是否使用
await Task.Run(synchronousMethod)
實現與調用FirstOrDefaultAsync()
相同的行爲?
關於1,您可以發佈完整的代碼和編譯器消息。可能是一個微不足道的問題。 – usr