entity.ToListAsync()。where或entity.Where()?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了entity.ToListAsync()。where或entity.Where()?相关的知识,希望对你有一定的参考价值。
我无法确定哪种方式最适合在我的WebAPI 2后端查询我的SQL Server
我试图尽可能经常使用async / await,但我发现当我返回整个集合时,没有可用的异步选项。
哪种方式最好?
[ResponseType(typeof(List<ExposedPublisher>))]
[HttpGet]
public async Task<IHttpActionResult> GetPublisher()
{
var list = new List<PublisherWithMedia>();
foreach (var publisher in _db.Publisher.Where(e => e.IsDeleted == false))
{
var pub = new PublisherWithMedia()
{
Id = publisher.Id,
Name = publisher.Name,
Mediae = new List<WebClient.Models.Media>()
};
foreach (var media in publisher.Media)
{
pub.Mediae.Add(ApiUtils.GetMedia(media));
}
list.Add(pub);
}
return Ok(list);
}
要么
[ResponseType(typeof(List<PublisherWithMedia>))]
[HttpGet]
public async Task<IHttpActionResult> GetPublisher()
{
var list = new List<PublisherWithMedia>();
var entity = await _db.Publisher.ToListAsync();
foreach (var publisher in entity.Where(e => e.IsDeleted == false))
{
var pub = new PublisherWithMedia()
{
Id = publisher.Id,
Name = publisher.Name,
Mediae = new List<WebClient.Models.Media>()
};
foreach (var media in publisher.Media)
{
pub.Mediae.Add(ApiUtils.GetMedia(media));
}
list.Add(pub);
}
return Ok(list);
}
该操作可能会导致非常大的结果集,因此直接过滤数据库是有意义的,特别是因为随着时间的推移,删除的记录数量可能会超过未删除的数量。但是,由于子结果(Media)的大结果和查询,使操作异步运行也是有意义的,因为它应该非常耗时。可悲的是,在这种背景下没有异步的Where()
。
还是有第三种我不知道的方式?
答案
您可以充分利用这两个方面:在数据库中过滤并异步执行查询:
var publishers = await _db.Publisher
.Where(e => !e.IsDeleted)
.ToListAsync();
也就是说,根据ApiUtils.GetMedia(media)
的作用,您甚至可以对查询执行投影:
var publishers = await _db.Publisher
.Where(e => !e.IsDeleted)
.Select(e => new PublisherWithMedia()
{
Id = e.Id,
Name = e.Name,
Mediae = e.Mediae.Select(m => ApiUtils.GetMedia(m)).ToList()
};
.ToListAsync();
以上是关于entity.ToListAsync()。where或entity.Where()?的主要内容,如果未能解决你的问题,请参考以下文章