¿Es posible tener una subconsulta en la parte .Select
de una consulta de LINQ to Entities
para completar una List<string>
dentro de mi modelo de vista? Encontré la subconsulta Use Linq To Entities dentro de la cláusula Select para obtener un valor de campo, pero cuando intento hacerlo, aparece el error:
NotImplementedException: Microsoft.Data.Entity.Query.ResultOperators.Internal.QueryAnnotationResultOperator
¿Es posible hacer esto con Entity Framework 7 y 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 se llena:
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; }
}
Modelo de datos:
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; }
}
Si asumo correctamente, debe tener una relación de uno a muchos entre ReleaseVersions
y ReleaseNotes
, lo que significa que debería haber una propiedad de navegación en la clase ReleaseVersion
refiera a la colección de ReleaseNotes
, lo que le permite volver a escribir su código de esta manera:
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();
Actualizar
Use List<string> ReleaseNotes
lugar de ICollection<string>
en ReleaseNotesVM
.