Arm*_*man 3 c# linq sql-server performance linq-to-sql
我一直在寻找如何连接两个表(数据表和数据值,一对多)并填充type的字典。
数据的记录可能是数千个(例如500,000个或更多),每个数据可能具有10到20个DataValue,这使它的查询量大得多,因此性能在这里非常重要。
这是我编写的代码:
// Passed via the arguments, for example, sensorIDs would contain:
int[] sensorIDs = { 0, 1, 2, 3, 4, 5, 6, 17, 18 };
Dictionary<Data, List<DataValue>> dict = new Dictionary<Data, List<DataValue>>();
foreach (Data Data in dt.Datas)
{
var dValues = from d in dt.Datas
join dV in dt.DataValues on d.DataID equals dV.DataID
where (SensorIDs.Contains(dV.SensorID))
select dV;
dict.Add(Data, dValues.ToList<DataValue>());
}
Run Code Online (Sandbox Code Playgroud)
但是这种方法存在严重的性能问题,并且执行时间较长。不知道我是否需要使用SQL视图。有什么建议么?
您查询的方式太多次了。您可以在一个查询中执行此操作。
var dict = (from d in dt.Datas
join dV in dt.DataValues on d.DataID equals dv.DataID
where SensorIDs.Contains(dv.SensorID)
select new { d, dV }).ToDictionary(o => o.d, o => o.dV.ToList());
Run Code Online (Sandbox Code Playgroud)
在foreach循环中,您正在获取所有内容,Data并且对于每个对象,您都在做相同的事情。
编辑:现在还不是很清楚,但是我认为您只想加入DataValueSensorIDs数组中的。在这种情况下:
var dict = (from d in dt.Datas
let dV = (from dataValue in dt.DataValues
where SensorIDs.Contains(dataValue.SensorID) &&
dataValue.DataID = d.DataID
select dataValue)
select new { d, dV }).ToDictionary(o => o.d, o => o.dV.ToList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5319 次 |
| 最近记录: |