如何使用linq遍历所有图像,但仅在这些图像中搜索字符串的一部分?

时间:2019-06-16 11:18:15

标签: linq

我收藏了images。它们全部根据其用途命名。 对于徽标,它们遵循约定business_logo,对于日志,它们遵循约定business_logbook

现在,我想对所有图像进行一次LinQ迭代,找到包含(_logbook)的图像,以便可以在该日志中删除该图像。如果我从上下文中删除它,它将自动从wwwroot中删除它。

此外,查询还需要异步。

1 个答案:

答案 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));