c# - 如何在不枚举数据的情况下进行异步查询?
问题描述
我正在尝试解决如何GetAll<T>
在 Entity Framework Core 中编写通用异步数据库方法而不枚举数据。我想要GetAll<T>
异步,但不希望它枚举数据,以便我可以在Where
之后添加一个方法,并将其应用于数据库查询..
List<Customer> customers = await _customerRepository.GetAll()
.Where(c => c.Name.StartsWith("a"))
.ToList();
MSDN 关于异步查询的文章显示了以下内容...
public async Task<List<Blog>> GetBlogsAsync()
{
using (var context = new BloggingContext())
{
return await context.Blogs.ToListAsync();
}
}
...但是(如果我理解正确的话)调用ToListAsync()
将枚举数据,这意味着它将整个Blogs
数据集加载到内存中,然后才应用Where
应用于结果的方法将指定的任何过滤。
我可以有一个返回 a 的异步方法IEnumerable<T>
吗?
如果这是一种更好的方法,我很高兴不使用存储库。本文表明 EF Core 不会从存储库中受益,但我也看不出如何按照他的方式做我想做的事。
更新:为了澄清(感谢 DavidG),我的想法是我的 ASP.NET Core 控制器可以有一个注入的存储库,并且可以执行异步查询来获取数据。我正在考虑使存储库通用,并在控制器中进行过滤,因此问题。我知道我可以编写一个CustomersRepository
并拥有一个CustomersThatStartWith
方法,但随后存储库变得臃肿。我一直在寻找尽可能简单的存储库。
解决方案
最安全的做法是让您的调用者(在您的情况下是控制器,尽管我建议将您的逻辑保留在它们之外)传递他们自己的过滤器。例如这样的事情:
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");
推荐阅读
- excel - 为什么筛选功能在excel中不起作用?
- c# - 当方法具有 [AllowAnonymous] 时调用自定义 AuthenticationHandler
- python - 如何计算二维数组中有多少个包含某个字符串的元素?
- ios - 如何在表格视图中设置json数据
- sql - SQL Server BCP 实用程序未创建输出文件
- sql - 如何在 SQL 中考虑多语言环境的本地化
- python - 在 PyQt5 中创建复杂的自定义小部件并将其添加到 QGridlayout
- php - 在 Yii2 ActiveForm 中上传不同属性的文件
- rabbitmq - 更新证书后,RabbitMQ Shovel over TLS 错误与 badmatch
- applescript - 如何从键盘快捷键返回值