- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在努力研究如何编写通用异步 GetAll<T>
Entity Framework Core 中的数据库方法,无需枚举数据。我要GetAll<T>
是异步的,但不希望它枚举数据,这样我就可以添加 Where
之后的方法,并将其应用于数据库查询..
List<Customer> customers = await _customerRepository.GetAll()
.Where(c => c.Name.StartsWith("a"))
.ToList();
MSDN's article on async queries显示以下...
public async Task<List<Blog>> GetBlogsAsync()
{
using (var context = new BloggingContext())
{
return await context.Blogs.ToListAsync();
}
}
...但是(如果我理解正确的话)对 ToListAsync()
的调用将枚举数据,这意味着它将加载整个 Blogs
数据集存入内存,然后才应用任何过滤 Where
应用于结果的方法将指定。
我可以有一个返回 IEnumerable<T>
的异步方法吗?相反?
如果存储库是更好的方法,我很乐意不使用存储库。 This article建议 EF Core 不会从存储库中受益,但我也看不到如何按照他的方式做我想做的事。
更新:澄清一下(感谢 DavidG),我的想法是我的 ASP.NET Core Controller 可以有一个注入(inject)的存储库,并且可以执行异步查询来获取数据。我正在考虑使存储库通用,并在 Controller 中进行过滤,因此出现了这个问题。我知道我可以写一个 CustomersRepository
并且有一个CustomersThatStartWith
方法,但随后存储库变得臃肿。我一直在寻找尽可能简单的存储库。
最佳答案
最安全的做法是允许您的调用者(在您的情况下是 Controller ,尽管我建议您将逻辑放在它们之外)传递他们自己的过滤器。例如这样的事情:
public async Task<List<T>> GetAsync<T>(params Expression<Func<T, bool>>[] filters)
{
IQueryable<T> query = _context.Set<T>();
if(filters != null)
{
foreach (var filter in filters)
{
query = query.Where(filter);
}
}
return await query.ToListAsync();
}
然后这样调用它:
var allUsers = await repository.GetAsync<User>();
var zombies = await repository.GetAsync<User>(u => u.IsUndead == true);
var zombieDevelopers = await repository.GetAsync<User>(
u => u.IsUndead = true,
u => u.JobTitle = "Developer");
关于c# - 如何在不枚举数据的情况下进行异步查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55680032/
我是一名优秀的程序员,十分优秀!