首页 > 解决方案 > 如何使用 linq 遍历所有图像,但只搜索这些图像中字符串的一部分?

问题描述

我有一个集合images。它们都是根据它们的用途命名的。对于徽标,他们遵循惯例business_logo,对于日志,他们遵循惯例business_logbook

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

查询也需要是异步的。

标签: linq

解决方案


您选择路径包含您正在搜索的字符串的项目:

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

推荐阅读