【发布时间】:2019-07-28 19:59:23
【问题描述】:
我正在做一个项目,我想用 logdata 制作图表。
所以我已经在我的 sql 服务器中加载了我的日志数据,并找到了产生我需要的结果的查询。每个日志条目包含每 2 秒的测量值。
SELECT '7am' as timeslot, MAX(Odometer_km) - MIN(Odometer_km) as distance, AVG(Tanktemperature_C) tanktemp, AVG(Pressure_bar) avgBar FROM [FC66294]
where [epochasdate] >= '2018-05-03 07:00:00' AND [epochasdate] <= '2018-05-03 08:00:00'
UNION
SELECT '8am' as timeslot, MAX(Odometer_km) - MIN(Odometer_km) as distance, AVG(Tanktemperature_C) tanktemp, AVG(Pressure_bar) avgBar FROM [FC66294]
where [epochasdate] >= '2018-05-03 08:00:00' AND [epochasdate] <= '2018-05-03 09:00:00'
UNION
SELECT '9am' as timeslot, MAX(Odometer_km) - MIN(Odometer_km) as distance, AVG(Tanktemperature_C) tanktemp, AVG(Pressure_bar) avgBar FROM [FC66294]
where [epochasdate] >= '2018-05-03 09:00:00' AND [epochasdate] <= '2018-05-03 10:00:00'
此示例显示了三个时间段,其中一些计算值在此时间段内。
现在我正在尝试使用 linq 查询在 C# 中重现此 SQL 结果,因为我想在图表中显示结果。我想出了以下几点:
using (var entity = new DBEntity.Entities())
{
var startDatetime = new DateTime(2018, 05, 03, 7, 0, 0);
var endDatetime = new DateTime(2018, 05, 03, 8, 0, 0);
var firstResult = entity.M_FC66294
.Where(x => x.epochasdate >= System.Data.Entity.DbFunctions.AddHours(startDatetime, 0) && x.epochasdate <= System.Data.Entity.DbFunctions.AddHours(endDatetime, 0))
.GroupBy(x => 1)
.Select(g => new {
TankTemp = g.Average(x => x.Tanktemperature_C),
Bar = g.Average(x => x.Pressure_bar),
MinOdo = g.Min(x => x.Odometer_km),
MaxOdo = g.Max(x => x.Odometer_km)
});
var secondResult = entity.M_FC66294
.Where(x => x.epochasdate >= System.Data.Entity.DbFunctions.AddHours(startDatetime, 0) && x.epochasdate <= System.Data.Entity.DbFunctions.AddHours(endDatetime, 0))
.GroupBy(x => 1)
.Select(g => new {
TankTemp = g.Average(x => x.Tanktemperature_C),
Bar = g.Average(x => x.Pressure_bar),
MinOdo = g.Min(x => x.Odometer_km),
MaxOdo = g.Max(x => x.Odometer_km)
});
var finalQuery = CreateEmptyEnumerable(firstResult);
for (var i = 1; i <= 24; i++)
{
var result = entity.M_FC66294
.Where(x => x.epochasdate >= System.Data.Entity.DbFunctions.AddHours(startDatetime, i) && x.epochasdate <= System.Data.Entity.DbFunctions.AddHours(endDatetime, i))
.GroupBy(x => 1)
.Select(g => new {
TankTemp = g.Average(x => x.Tanktemperature_C),
Bar = g.Average(x => x.Pressure_bar),
MinOdo = g.Min(x => x.Odometer_km),
MaxOdo = g.Max(x => x.Odometer_km)
});
finalQuery = finalQuery.Concat(result);
}
var test1 = firstResult.Concat(secondResult).ToList();
var test2 = finalQuery.ToList();
}
现在变量 test1 实际上包含 2 行我需要的数据。但我希望变量 test2 包含 24 行(1 天)的数据。
但它不包含任何行。
那么,如何连接多个结果变量,然后在 finalQuery 上运行 ToList()?
编辑:或者我如何在循环内使用 concat?
【问题讨论】:
-
发送到数据库的查询与您期望的查询有什么区别?
-
SQL 和 C# 查询在理想情况下应该有相同的结果,除了我会在 C# 版本中使用几个时间参数来适应用户请求。 linq 也有一个 groupby,我曾经能够在 linq 查询中选择聚合变量(我不知道如何获得这些聚合结果)。
-
我不是在询问结果。我问的是查询。 LINQ 生成的查询与您的预期/想要的有什么不同?
-
感谢您抽出宝贵时间调查此事。
var test1 = firstResult.Concat(secondResult).ToList();让我得到了我想要的结果。但它只有两行数据。基本上,我想要的结果可能如下所示:var test2 = firstResult.Concat(secondResult).Concat(thirdResult).Concat(untill_i_Result).ToList();除了 finalQuery 变量在循环完成后似乎不包含任何 Sql。 -
请看一下发送到数据库的T-SQL。