使用linq连接两个表,并填写它们的字典

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视图。有什么建议么?

Sim*_*ger 5

您查询的方式太多次了。您可以在一个查询中执行此操作。

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)