gpt4 book ai didi

c# - 分层数据的高级LINQ分组和投影查询(EF 4.0 + LINQ + ASP.NET MVC + HighCharts)

转载 作者:太空狗 更新时间:2023-10-30 00:55:00 25 4
gpt4 key购买 nike

问题概述:
我有一些数据库表,它们描述了使用web服务从多个设备收集数据到集中数据库的过程。
存储结果的表是为了提高性能而故意取消规范化的:通过多个索引更快地查询和分组。
我使用实体框架和linq进行数据访问。
我需要使用分层分组和
投影。
设备数据库建模概述:
目前我有两种设备
一。射频识别设备
第一个表是rfidtag,它描述了收集数据的标记,1个rfidtag=1个传感器。例如,一个标签可以得到关于温度的数据。
第二个表是rfidreader,它描述了读取模块,该模块从附加的标记中收集并发送所有数据。附加到单个rfidreader的rfidtags的数量没有限制。但是,在读取期间,可以将一个rfidtag附加到一个rfidreader。

CREATE TABLE [dbo].[RfidTag]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
ReaderId INT NULL, -- Reference to reader
SensorTypeId INT NOT NULL, -- Reference to sensor type
SensorParameters NVARCHAR(50) NULL, -- Sensor parameters
Hex NVARCHAR(50) NOT NULL, -- Hex tag identifier stored as string
Name NVARCHAR(50) NOT NULL, -- Tag name
[Description] NVARCHAR(200) NULL, -- Tag description
--
)

CREATE TABLE [dbo].[RfidReader]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
Name NVARCHAR(20), -- Tag name
[Description] NVARCHAR(200), -- Tag description
SerialNumber NVARCHAR(12), -- Unique device serial name
--
)

每个rfidreader可以附加到特定的测量区域,该测量区域是为特定的结构而描述的。
CREATE TABLE [dbo].[RfidReaderPlacement]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
--
ReaderId INT NOT NULL, -- Reference to Reader.
MeasurementZoneId INT NOT NULL, -- Reference to Measurement Zone.
StartDate DATETIME NOT NULL, -- Start date of reading.
StopDate DATETIME, -- End date of reading.
--
)

rfidtag收集的单个数据保存在非规范化表中。这张桌子储存了数百万条记录,而且真的很重。从这个表中,我们将使用linq查询收集数据。
CREATE TABLE [dbo].[RfidReading]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
ReaderPlacementId INT NOT NULL, -- Reference to Rfid Reader Placement
ConstructionId INT NOT NULL, -- Reference to Construction
MeasurementZoneId INT NOT NULL, -- Reference to Measurement Zone
ReaderId INT NOT NULL, -- Reference to Rfid Reader
TagId INT NOT NULL, -- Reference to Rfid Tag
SensorTypeId INT NOT NULL, -- Reference to Sensor Type
ReadingDate DATETIME NOT NULL, -- Reading date
Value FLOAT NOT NULL -- Measured value
--
)

2.Zigbee设备
第一个表是zigbeenodeprobe,它描述了收集数据的单探针,1个zigbeenodeprobe=1个单传感器。例如,一个单探头可以得到温度的数据。
第二个表是zigbeenode,它描述了包含附加探针的单个设备,1个zigbeenode=3个zigbeenode probes。
第三个表是zigbeereader,它描述了从连接的节点收集并发送所有数据到它的读取模块。对于连接到单个zigbeereader的zigbeenode(已连接zigbeenodeprobes)的数量没有限制。然而,在读取期间,单个zigbeenode可以连接到单个zigbeereader。
CREATE TABLE [dbo].[ZigBeeNodeProbe]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
--
NodeId INT NULL, -- Reference to node
SensorTypeId INT NOT NULL, -- Reference to sensor type
SensorParameters NVARCHAR(50) NULL, -- Sensor parameters
SocketNumber INT NOT NULL, -- Socket number used in parent ZigBeeNode
Name NVARCHAR(50) NOT NULL, -- Node name
[Description] NVARCHAR(200) NULL, -- Node description
--
)

CREATE TABLE [dbo].[ZigBeeNode]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
ReaderId INT NULL, -- Reference to reader
NetworkAddress NVARCHAR(50) NOT NULL,-- Node address in ZigBee network
Name NVARCHAR(50) NOT NULL, -- Given name
[Description] NVARCHAR(200) NULL, -- Tag description
SocketCount INT NOT NULL DEFAULT 0, -- Count of available sockets to plug in probe
NodeFrequency INT NULL, -- Node frequency
)

CREATE TABLE [dbo].[ZigBeeReader]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
Name NVARCHAR(20), -- Tag name
[Description] NVARCHAR(200), -- Tag description
SerialNumber NVARCHAR(12), -- Unique device serial name
--
)

每个zigbeereader可以附加到特定的测量区域,该测量区域是为特定的结构而描述的。
CREATE TABLE [dbo].[ZigBeeReaderPlacement]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
--
ReaderId INT NOT NULL, -- Reference to Reader.
MeasurementZoneId INT NOT NULL, -- Reference to Measurement Zone.
StartDate DATETIME NOT NULL, -- Start date of reading.
StopDate DATETIME, -- End date of reading.
--
)

zigbeenodeprobe收集的单个数据保存在非规范化表中。这张桌子储存了数百万条记录,而且真的很重。从这个表中,我们将使用linq查询收集数据。
CREATE TABLE [dbo].[ZigBeeReading]
(
Id INT IDENTITY(1,1),
CreatedDateTime DATETIME NOT NULL DEFAULT GETDATE(),
ModifiedDateTime DATETIME,
--
ReaderPlacementId INT NOT NULL, -- Reference to ZigBee Reader Placement
ConstructionId INT NOT NULL, -- Reference to Construction
MeasurementZoneId INT NOT NULL, -- Reference to Measurement Zone
ReaderId INT NOT NULL, -- Reference to ZigBee Reader
NodeId INT NOT NULL, -- Reference to ZigBee Node
ProbeId INT NOT NULL, -- Reference to ZigBee Node Probe
SensorTypeId INT NOT NULL, -- Reference to Sensor Type
ReadingDate DATETIME NOT NULL,-- Reading date
Value FLOAT NOT NULL -- Measured value
--
)

查询、分组和投影问题:
如您所见,我们有两个非集中化表,其中包含由两种类型的设备收集的数据。是的,我们可以假设rfidtag在业务建模中几乎与zigbeenodeprobe相同。
RfidReader
-- RFidTag
-- RFidTag
...

ZigBeeReader
-- ZigBeeNode
---- ZigBeeNodeProbe
---- ZigBeeNodeProbe
---- ZigBeeNodeProbe
-- ZigBeeNode
---- ZigBeeNodeProbe
---- ZigBeeNodeProbe
---- ZigBeeNodeProbe
...

现在我们必须查询这两个表,将不同表中的值投影到同一视图模型中,并添加特定的分组以过滤数据。
常见场景:
我们希望创建一个图表,显示特定测量区域的平均温度,请记住,特定测量区域可能包含多个附加读卡器(RFID和ZigBee),我们必须提供一系列数据。
我正在使用HightStock http://www.highcharts.com/products/highstock图表,该图表必须已启用:
缩放1个月、3个月、6个月等。
起止期间
导出功能
启用和禁用系列的图例
图表示例:
http://jsfiddle.net/hNHUY/1/
问题:
如何创建分层数据的linq分组和投影查询?
我们需要为rfidreading和zigbeereading表提供通用视图模型。
我的第一次尝试是:
public class ReadingReaderDataModel
{
public string SeriesName { get; set; }
public ReadingPeriod ReadingPeriod { get; set; }

public IEnumerable<ReadingNodeDataModel> ReadingNodeDataModels { get; set; }
public ReadingReaderDataModel()
{
ReadingNodeDataModels = new List<ReadingNodeDataModel>();
}
}

public class ReadingNodeDataModel
{
public string NodeName { get; set; }
public IEnumerable<double> DataValues { get; set; }
public ReadingNodeDataModel()
{
DataValues = new LinkedList<double>();
}
}

public enum ReadingPeriod
{
OneMonth, ThreeMonths, SixMonths, YearToDay, OneYear, All
}

public enum ReaderType
{
Rfid, ZigBee
}

后来,我不得不为asp.net mvc控制器设计linq投影,在这里,我不知道如何创建正确的查询,该查询必须包含按一个月、三个月、六个月、一年、今天、一年、全部分组的时间段的平均值。
有谁能帮我设计这个高级linq查询吗?
编辑
请不要给我任何关于大数据集的“建议”…
这不是性能问题。
这个问题是关于复杂的linq查询的。我正在寻找正确的LINQ代码,而不是像“那辆车更快,你应该尝试使用那辆车”…请输入密码…如果你甚至不试图理解场景,并提供任何代码,不要参与…
我特别添加了一个悬赏金来为linq找到一个解决方案,因为在这个问题的主题中,它是高级linq问题。

最佳答案

据我所知,一个数据库中有数百万条记录,需要应用程序有很好的性能,而且结构非常复杂。
离英孚远点,我是认真的。您可以将它用于较小的数据集,但对于任何需要从大型查询获得卓越性能的数据集,甚至都不要使用它。
我的建议是手动编写查询,因为如果您希望使用ef尽可能优化,那么实际上无论如何都不能跳过很多代码,而且基本上是用linq方式编写sql(即指定所有select语句)。
如果你想更具体一点,就用得体一点。是“orm”运行stackoverflow。这里有速度比较:http://code.google.com/p/dapper-dot-net/
但是,如果你已经决定使用ef…
不要试图编写一个查询。不会发生的。相反,把它们分开。为你需要的每一组做一个不同的。这是目前为止最简单的出路。我相信你应该已经有了一个linq查询,只得到一个组。现在对你需要的其他组重复这个步骤,特别是如果你有大量的where和orderby在其中。
资料来源:一个每天处理大型数据集查询的人。

关于c# - 分层数据的高级LINQ分组和投影查询(EF 4.0 + LINQ + ASP.NET MVC + HighCharts),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10874835/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com