在c#数据检索中使用lambda表达式的问题

时间:2017-09-17 17:55:32

标签: c# lambda

我正在编写一个系统来跟踪不同地点的传感器观测值(例如温度,风向和速度)。我使用代码优先方法在C#(VS2015内)中编写它。虽然我有相当多的编程经验,但我对C#和代码优先方法相对较新。

我已将我的课程定义如下。我已经构建了一个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;

的定义

可能会出现各种各样的肮脏,但如果有人可以解释错误的位置(更重要的是为什么会出现错误),那么我将非常感激。

2 个答案:

答案 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 fileAbout.cshtml页面。这会生成this page,这就是您所信仰的内容。