gpt4 book ai didi

c# - 如何在不枚举数据的情况下进行异步查询?

转载 作者:太空宇宙 更新时间:2023-11-03 22:34:57 25 4
gpt4 key购买 nike

我正在努力研究如何编写通用异步 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com