Search code examples
nhibernatequeryover

Select or SelectList: I Want to include the entire entity


I am querying a list of objects, and then correlating them with a subquery.

I want to return the results of the subquery, as well as the root entity. But

I can't figure out how to actually return the root entity, I can only return individual properties of it.

Specifically, this works:

this.Session.QueryOver<MediaFile>(() => mediaFile)
            .SelectList(list => list.Select(mf => mf.Id));

But this does not:

this.Session.QueryOver<MediaFile>(() => mediaFile)
            .SelectList(list => list.Select(mf => mf));

I get the following error:

Could not resolve property : of MediaFile

Does anyone know how I can include the entity as a property in the list?

Here's my complete example:

// My target class
private class MediaFileAndCount
{
    // I can successfully populate these fields.
    public long MediaFileId { get; set; }
    public int DistinctPlaylistCount { get;set; }

    // But I want to populate this field!
    public MediaFile MediaFile { get; set; }
}


private void TrySingleQuery()
{
    MediaFile mediaFile = null;
    PlaylistEntry playlistEntry = null;

    MediaFileAndCount mfc = null;
    var subQuery = QueryOver.Of<PlaylistEntry>(() => playlistEntry)
        .Where(() => playlistEntry.MediaFile.Id == mediaFile.Id)
        .Select(Projections.CountDistinct<PlaylistEntry>(p => p.Playlist));


    var query = this.Session.QueryOver<MediaFile>(() => mediaFile)
        .SelectList(list => list
            .Select(mf => mf.Id).WithAlias(() => mfc.MediaFileId)
            .Select(Projections.SubQuery(subQuery)).WithAlias(() => mfc.DistinctPlaylistCount)
     // .Select(mf => mf).WithAlias(() => mfc.MediaFile)  // This line fails
        )
        .TransformUsing(Transformers.AliasToBean<MediaFileAndCount>());


    var results = query.List<MediaFileAndCount>();
}

Solution

  • another way to query it

    var allMediaFiles = session.QueryOver<MediaFile>().Where(...).ToFuture(); // just get the MediaFiles into sessionCache
    
    var results = session.QueryOver<PlaylistEntry>()
        .Where(p => p.MediaFile...)
        .SelectList(list => list
            .GroupBy(p => p.MediaFile.Id)
            .CountDistinct(p => p.Playlist))
        .ToFuture<object[]>()
        .Select(a => new MediaFileAndCount
        {
            MediaFile = session.Get<MediaFile>((long)a[0]),
            DistinctPlaylistCount = (int)a[1]
        })
        .ToList();
    
    foreach (var mediaFile in allMediaFiles.Except(results.Select(r => r.MediaFile)))
    {
        results.Add(new MediaFileAndCount { MediaFile = mediaFile });
    }