如何将 IQueryable<IList<AnimeTitle>> 转换为 IQueryable<AnimeTitle>

How to convert IQueryable<IList<AnimeTitle>> to IQueryable<AnimeTitle>

我需要通过 id 获取一个集合,它有 IList<AnimeTitle> AnimeTitles,我需要将其转换为 IQueryable<AnimeTitle> 并投射到 BriefTitleVW 以结束 IQueryable<BriefTitleVW> .

在示例代码中,我使用AutoMapper ProjectTo<BriefTitleVM>(_mapper.ConfigurationProvider)进行转换,但这是不可能的,因为这种方法只能将IQueryable<AnimeTitle>转换为IQueryable<BriefTitleVM>

因此归结为将 IQueryable<IList<AnimeTitle>> 转换为 IQueryable<AnimeTitle>

问题:怎么做?

var titles = await _dbContext.AnimeCollections
                             .Where(c => c.Id == request.CollectionId && c.UserId == request.UserId)
                             .Select(c => c.AnimeTitles)
                             .ProjectTo<BriefTitleVM>(_mapper.ConfigurationProvider)

您可以更改:

.Select(c => c.AnimeTitles)

收件人:

.SelectMany(c => c.AnimeTitles)

当你有一个“X列表的列表”时(你在db.AnimeCollections中有一个AnimeCollection个对象的列表,每个AnimeCollection都有一个[=17=的列表] 中的对象 AnimeTitles) 您可以使用 SelectMany 将其变成一个直接的“X 列表”。 SelectMany,概念上是这样做的:

List<AnimeTitle> result = new();
foreach(AnimeCollection c in db.AnimeCollections)
  result.AddRange(c.AnimeTitles);
return result;

因此,您的一般模式是向 .SelectMany 提供一个 lambda,该 lambda 在列表中的每个对象上选择一个集合,然后生成所有集合中所有项目的单个列表

//one list of all child items
parentCollection.SelectMany(item => item.ChildCollection)