我的proc返回所有结果,但MVC显示查找为空。
我有一个VIEW,其中“grid”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中,当我将鼠标悬停在“results”上时,AdvisoryCategoryID被填入,但AdvisoryCategory为null。与其他两个查找相同。我认为这是因为AdvisoryCategoryID在我的咨询模型中,但是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返回的数据?感谢。
答案 0 :(得分:0)
我认为这是关于eager loading of navigation properties
(AdvisoryCategory
等),如果我理解你正在尝试做什么......
如果您尝试从SQL查询中加载
navigation properties
- SP - 我认为这不起作用。这是上面正常linq语句的Include
部分 - 然后生成 一个更复杂的SQL加入其他表的属性等。它得到 更复杂,更多。
这对于代码优先不起作用,即使它需要特殊的“技术”才能使其匹配。
请在此处查看此链接以获取确认Eager Load from Entity Framework SP
您可以尝试默认将其设置为lazy loading
(虚拟等) - 并希望它在首次访问时加载。也尝试不同的loading methods。
或者只是按需明确加载 - 请参阅this link和Explicitly Loading
。
<小时/> Eager Load from Entity Framework SP
答案 1 :(得分: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; }
现在我用这条线调用我的proc,将“Advisory”替换为“AdvisoryViewModel”:
var advisories = db.Database.SqlQuery<AdvisoryViewModel>("EXEC [ponzi].[uspUserAdvisories] {0}", User.Identity.Name).ToList();
由于返回的数据集具有相同字段的模型,并且不依赖于其他模型,因此它可以正常工作。