1

私のプロシージャはすべての結果を返しますが、MVC はルックアップが null であることを示しています。

ループの「グリッド」が次のように見えるビューがあります。

@foreach (var item in Model) {
    <tr>
        <td>@Html.ActionLink(item.Headline, "ViewDetails", "Advisory", new { id=item.AdvisoryId }, "")</td>
        <td>@item.AdvisoryStartDate.ToShortDateString()</td>
        <td>@item.AdvisoryType.AdvisoryType</td>
        <td>@item.AdvisoryProvider.AdvisoryProvider</td>
        <td>@item.AdvisoryCategory.AdvisoryCategory</td>         
    </tr>
}

最後の 3 つのフィールドはルックアップです。最初に、このコントローラー呼び出しでこれを設定しました。

var advisories = db.Advisories.Include(i => i.AdvisoryType)
            .Include(i => i.AdvisoryProvider)
            .Include(i => i.AdvisoryCategory)
            .OrderByDescending(i => i.AdvisoryStartDate);
        ViewData["Advisories"] = advisories;

しかし、これをこの proc 呼び出しに置き換えました (ユーザーがまだ見ていない「アドバイス」を取得する必要があるため、上記よりも複雑で、基本的には「すべて取得」です。また、クエリを実行する必要がありますUserID による DB に対して、MVC には User.Identity.Name しかありません):

var results = db.Database.SqlQuery<Advisory>("EXEC [ponzi].[uspUserAdvisories] {0}",  User.Identity.Name).ToList();
ViewData["Advisories"] = results;

proc がすべての結果を返すことはわかっていますが (SQL Server で実行すると)、MVC では、「結果」にマウスを合わせると、AdvisoryCategoryID が入力されますが、AdvisoryCategory は null です。他の 2 つのルックアップと同じです。AdvisoryCategoryID が Advisory モデルにあるためだと思いますが、 AdvisoryCategory は AdvisoryCategory モデルからのものです。

アドバイザリ モデルの関連部分は次のとおりです。

[Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int AdvisoryId { get; set; }

    public virtual int AdvisoryTypeID { get; set; }
    public virtual AdvisoryTypes AdvisoryType { get; set; }

    public virtual AdvisoryProviders AdvisoryProvider { get; set; }
    public virtual int AdvisoryProviderID { get; set; }

    public virtual AdvisoryCategories AdvisoryCategory { get; set; }
    public virtual int AdvisoryCategoryID { get; set; }

これら 3 つのルックアップ フィールドを取得して、proc によって返されたデータを表示するにはどうすればよいですか? ありがとう。

4

2 に答える 2

0

私は解決策を見つけました:ViewModels。新しい AdvisoriesViewModel の関連部分 (私の Advisories モデルを置き換えるため):

    public int AdvisoryTypeID { get; set; }
    public string AdvisoryType { get; set; }

    public string AdvisoryProvider { get; set; }
    public int AdvisoryProviderID { get; set; }

    public string AdvisoryCategory { get; set; }
    public int AdvisoryCategoryID { get; set; }

"Advisory" を "AdvisoryViewModel" に置き換えて、次の行で proc を呼び出します。

var advisories = db.Database.SqlQuery<AdvisoryViewModel>("EXEC [ponzi].[uspUserAdvisories] {0}", User.Identity.Name).ToList();

返されたデータセットには同じフィールドを持つモデルがあり、別のモデルに依存していないため、機能します。

于 2013-04-09T17:28:46.067 に答える
0

eager loading of navigation properties(など)についてだと思いますAdvisoryCategoryが、あなたが何をしようとしているのかを正しく理解していれば...

SQLクエリ、SPからロードしようとしている場合navigation properties、それはうまくいかないと思います。これIncludeは上記の通常の linq ステートメントの一部であり、他のテーブルのプロパティなどに結合するためのより複雑な SQL を生成します。

これは、コードファーストでは機能せず、一致させるために特別な「テクニック」が必要な場合でも機能しません。

Entity Framework SP からの Eager Loadの確認については、このリンクを参照してください。

lazy loadingデフォルトで(仮想など)に設定してみてください。最初のアクセスで読み込まれることを願っています。また、さまざまな読み込み方法を試してください。

または、オンデマンドで明示的にロードするだけです。このリンクとを参照してくださいExplicitly Loading


Entity Framework SP からのイーガー ロード
http://msdn.microsoft.com/en-US/data/jj574232
DbContext.Database.SqlQuery を使用した EntityFramework でのイーガー ロード

于 2013-04-09T17:27:15.847 に答える