LINQ to EntitiesのSELECTでサブクエリを実行してモデル内のListを満たすことはできますか?

entity-framework-core linq

質問

LINQ to Entitiesクエリの.Select部分にサブクエリを配置して、ビューモデル内のList<string>を埋めることは可能ですか? フィールド値を取得するために、Select句内のLinq To Entitiesサブクエリを使用していますが、そのときにエラーが発生しています。

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; }
}

受け入れられた回答

私が正しく仮定すれば、 ReleaseVersionsReleaseNotesとの間に1 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



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ