linq - 我可以在 LINQ to Entities 的 SELECT 中执行子查询以填充模型中的列表吗?

标签 linq entity-framework-core

.Select中是否可以有子查询? LINQ to Entities 的一部分查询以填写 List<string>在我的 View 模型中?我找到了 Use Linq To Entities subquery within Select clause to fetch a field value但是当我尝试这样做时,我收到错误消息:

NotImplementedException: Microsoft.Data.Entity.Query.ResultOperators.Internal.QueryAnnotationResultOperator



这可能与 Entity Framework 7 和 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:
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; }
}

数据模型:
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; }
}

最佳答案

如果我假设正确,您必须在 ReleaseVersions 之间建立一对多关系。和 ReleaseNotes ,这意味着 ReleaseVersion 中应该有导航属性类指的是 ReleaseNotes 的集合,使您能够像这样重写代码:

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();

更新

使用 List<string> ReleaseNotes而不是 ICollection<string>ReleaseNotesVM .

关于linq - 我可以在 LINQ to Entities 的 SELECT 中执行子查询以填充模型中的列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34863778/

相关文章:

c# - .Include 方法是否命中 LINQ 中的数据库?

c# - 如何使 lambda 在列表列表中的位置?

mysql - DotnetCore2.0 webapi 中的 EntityFrameworkCore MySql 错误

asp.net-core - 如何在 EF .NET Core 中的 [AllowAnonymous] 端点上读取 JWT token

c# - 从表中选择静态组时保持顺序

c# - 在 select from with inner join in sql 查询中编写 linq similiar where in select from

c# - 构建 SQL Where 来自委托(delegate)的查询

c# - 表上的 EF Core 删除违反了表上的外键约束

c# - 使用 Entity Framework Core 停止在 Sqlite 内存 DB 中自动加载相关实体

asp.net-core - Entity Framework Core 始终返回外部行的空列表