I need to get a collection by id, it has IList<AnimeTitle> AnimeTitles
, which I need to convert to IQueryable<AnimeTitle>
and project into BriefTitleVW
to end up with IQueryable<BriefTitleVW>
.
In the sample code, I do the conversion using AutoMapper ProjectTo<BriefTitleVM>(_mapper.ConfigurationProvider)
, but this is not possible because this method can only convert IQueryable<AnimeTitle>
to IQueryable<BriefTitleVM>
.
So it comes down to converting IQueryable<IList<AnimeTitle>>
to IQueryable<AnimeTitle>
.
Question: how to do that?
var titles = await _dbContext.AnimeCollections
.Where(c => c.Id == request.CollectionId && c.UserId == request.UserId)
.Select(c => c.AnimeTitles)
.ProjectTo<BriefTitleVM>(_mapper.ConfigurationProvider)
CodePudding user response:
You can change:
.Select(c => c.AnimeTitles)
To:
.SelectMany(c => c.AnimeTitles)
When you have a "list of lists of X" (you have a list of AnimeCollection
objects inside db.AnimeCollections
, and each AnimeCollection
has a list of AnimeTitle
objects in its AnimeTitles
) you can turn it into a straight "list of X" by using SelectMany. SelectMany, conceptually does this:
List<AnimeTitle> result = new();
foreach(AnimeCollection c in db.AnimeCollections)
result.AddRange(c.AnimeTitles);
return result;
So your general pattern is to feed .SelectMany
with a lambda that chooses a collection on each object in a list, and it churns out a single list of all the items in all the collections
//one list of all child items
parentCollection.SelectMany(item => item.ChildCollection)