1

我的 proc 返回所有结果,但 MVC 显示查找为空。

我有一个视图,其中 for 循环的“网格”如下所示:

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

最后三个字段是查找。我最初用这个控制器调用填充了它:

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 进行数据库,而 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 为空。与其他两个查找相同。我认为这是因为 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; }

如何让这三个查找字段显示 proc 返回的数据?谢谢。

4

2 回答 2

0

我认为这是关于eager loading of navigation propertiesAdvisoryCategory等),如果我正确理解你想要做什么......

如果您尝试加载navigation properties- 从您的 SQL 查询 SP - 我认为这行不通。这是Include上面普通 linq 语句的一部分——它会生成一个更复杂的 SQL 来加入其他表的属性等。它越多就越复杂。

这不适用于代码优先,即使它需要特殊的“技术”才能使其匹配。

请在此处查看此链接以确认来自 Entity Framework SP 的 Eager Load

您可以尝试将其设置为lazy loading默认值(虚拟等) - 并希望它会在首次访问时加载。也尝试不同的加载方法

或者只是明确地按需加载- 请参阅此链接Explicitly Loading


从实体框架 SP
http://msdn.microsoft.com/en-US/data/jj574232
急切加载使用 DbContext.Database.SqlQuery 在 EntityFramework 中急切加载

于 2013-04-09T17:27:15.847 回答
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; }

现在我用这条线调用我的过程,用“AdvisoryViewModel”替换了“Advisory”:

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

由于返回的数据集具有具有相同字段的模型,并且不依赖于另一个模型,因此它可以工作。

于 2013-04-09T17:28:46.067 回答