我收藏了images
。它们全部根据其用途命名。
对于徽标,它们遵循约定business_logo
,对于日志,它们遵循约定business_logbook
。
现在,我想对所有图像进行一次LinQ
迭代,找到包含(_logbook)
的图像,以便可以在该日志中删除该图像。如果我从上下文中删除它,它将自动从wwwroot中删除它。
此外,查询还需要异步。
答案 0 :(得分:1)
您选择路径包含要搜索的字符串的项目:
public class Image
{
public string Name { get; set; }
}
var _imageRepo = new Collection<Image>()
{
new Image { Name = "business_logo_123954.png" },
new Image { Name = "business_logbook_529429.png" },
new Image { Name = "business_logo_81957.png" },
new Image { Name = "business_logbook_234820.png" }
};
var logBookImages = await _imageRepo
.Where(x => x.Name.Contains("_logbook"))
.ToListAsync();
// Or you can check that the file name starts with business_logbook.
var logBookImages = await _imageRepo
.Where(x => x.Name.StartsWith("business_logbook"))
.ToListAsync();
Linq查询既不异步也不同步。在您对查询调用各种实现方法之一之前,不会执行查询。在您的情况下,由于希望使数据实现异步,因此需要调用.ToListAsync()而不是.ToList()。这样做,您还需要在语句中添加await关键字。
我建议先获取您的项目集合,然后再删除它们,但这取决于您的偏好以及所使用的数据库系统/模式。
var logBookImagePathsToDelete = await _imageRepo
.Where(x => x.Path.StartsWith("business_logbook"))
.Select(x => x.Path)
.ToListAsync();
foreach(var path in logBookImagePathsToDelete)
await DeleteImageAsync(path);
如果您想在不创建任何变量的情况下一次完成所有操作,则可以执行以下操作:
(await _imageRepo
.Where(x => x.Path.Contains("_logbook"))
.Select(x => x.Path)
.ToListAsync())
.ForEach(async path => await DeleteImageAsync(path));