Is it possible to have a subquery in the .Select
part of a LINQ to Entities
query in order to fill a List<string>
inside my view model? I found Use Linq To Entities subquery within Select clause to fetch a field value but when I try to do that I am getting the error:
NotImplementedException: Microsoft.Data.Entity.Query.ResultOperators.Internal.QueryAnnotationResultOperator
Is this possible to do with Entity Framework 7 and ASP.Net 5 MVC 6?
var model = _DbContext.ReleaseVersions
.OrderByDescending(rv => rv.DateReleased)
.Select(rv => new ReleaseNotesVM()
{
ID = rv.ID,
CurrentVersion = string.Concat(rv.Major, '.', rv.Minor, '.', rv.Patch),
ReleaseNotes = _DbContext.ReleaseNotes
.Where(rn => rn.ReleaseVersionID == rv.ID)
.Include(rn => rn.ReleaseVersion)
.Select(rn => rn.Note)
.ToList()
}).FirstOrDefault();
ViewModel being filled:
public class ReleaseNotesVM
{
public byte ID { get; set; }
public string CurrentVersion { get; set; }
public DateTime CurrentVersionReleaseDate { get; set; }
public IEnumerable<SelectListItem> VersionList { get; set; }
public byte SelectedVersionID { get; set; }
public ICollection<string> ReleaseNotes { get; set; }
}
DataModel:
public class ReleaseVersion
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public byte ID { get; set; }
public DateTime DateReleased { get; set; }
public byte Major { get; set; }
public byte Minor { get; set; }
public byte Patch { get; set; }
public virtual ICollection<ReleaseNote> ReleaseNotes { get; set; }
}
public class ReleaseNote
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public string Note { get; set; }
public byte ReleaseVersionID { get; set; }
[ForeignKey("ReleaseVersionID")]
public ReleaseVersion ReleaseVersion { get; set; }
}
If I assume correctly, you must have a one-to-many relationship between ReleaseVersions
and ReleaseNotes
, which means that there should be a navigation property in the ReleaseVersion
class referring to the collection of ReleaseNotes
, enabling you to rewrite your code like this:
var model = _DbContext.ReleaseVersions
.Include(rv => rv.ReleaseNotes)
.OrderByDescending(rv => rv.DateReleased)
.Select(rv => new ReleaseNotesVM
{
ID = rv.ID,
CurrentVersion = string.Concat(rv.Major, '.', rv.Minor, '.', rv.Patch),
ReleaseNotes = rv.ReleaseNotes.Select(rn => rn.Note).ToList()
}).FirstOrDefault();
Update
Use List<string> ReleaseNotes
instead of ICollection<string>
in ReleaseNotesVM
.