我已将我的课程定义如下。我已经构建了一个REST api来接受通过Post读取的观察,这推动了我希望让传感器用字符串键而不是整数 - 有些传感器内置了自己独特的标识符。否则,我就是这样试图遵循Microsoft Contoso大学的例子(讲师 - 课程 - 注册)。
我想要实现的是特定网站的页面,其中包含网站上的传感器列表及其读数。最终,此页面将以图形形式显示数据。但就目前而言,我只是在原始数据之后。
public class Site
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<Sensor> Sensors { get; set; }
}
public class Sensor
{
[Key]
public string SensorName { get; set; }
public int SensorTypeId { get; set; }
public int SiteId { get; set; }
public ICollection<Observation> Observations { get; set; }
}
public class Observation
{
public int Id { get; set; }
public string SensorName { get; set; }
public float ObsValue { get; set; }
public DateTime ObsDateTime { get; set; }
}
我已经为我要使用的页面创建了一个视图模型...
public class SiteDataViewModel
{
public Site Site { get; set; }
public IEnumerable<Sensor> Sensors { get; set;}
public IEnumerable<Observation> Observations { get; set; }
}
然后我尝试将3个类连接到SiteController.cs中的View Model ...
public actionresult Details()
var viewModel.Site = _context.Sites
.Include(i => i.Sensors.select(c => c.Observations));
我曾经得到一个关于&#34的错误;无法将lambda表达式转换为类型字符串&#34;,但后来我使用System.Data.Entity包含&#34;&#34;并且错误已更改为两个错误...在&#39;包含&#39;,我得到&#34;无法解析方法&#39;包含(lambda表达式)&#39; ...&#34 ;。在&#39;选择&#39;我得到&#34; Icollection没有包含select ...&#34;
的定义可能会出现各种各样的肮脏,但如果有人可以解释错误的位置(更重要的是为什么会出现错误),那么我将非常感激。
答案 0 :(得分:1)
只需你可以使用
viewModel.Site = _context.Sites
.Include("Sensors).Include("Sensors.Observations");
希望这有帮助。
答案 1 :(得分:0)
您的ViewModel的设置方式,您将拥有3个不相关的数据集。站点,传感器和观察。站点与传感器没有内在联系 - 您必须在外键上手动匹配它们。实际上,您的ViewModel应该只是一个站点列表。你想做什么
@Model.Sites[0].Sensors[0].Observations[0]
不像是一个令人费解的东西
var site = @Model.Sites[0]; var sensor = @Model.Sensors.Where(s => SiteId == site.Id).Single();
等......
尝试做
viewModel.Site = _context.Sites.Include("Sensors.Observations").ToList();
Eager-loading multiple levels of EF Relations只需一行即可完成。
顺便提一下,您报告的错误之一是因为您使用的是“选择”而不是“ S 选举”
最后,要注意像这样的急切加载会产生大量的内存数据。考虑拆分对每个关系的调用,以便显示传感器列表,然后单击,例如,下拉列表将调用一个API来检索站点列表等。这会更加简化,并且它会阻止您因为你的页面加载了太多信息而受到阻碍。
更新的
我created a sample application为你提供了浏览和浏览的信息。数据填充在Startup.Configure
方法中,并检索in the About.cshtml.cs
file和About.cshtml
页面。这会生成this page,这就是您所信仰的内容。