这是因为它在LINQ中运行缓慢,还是因为我的方式很差?

use*_*648 1 c# sql linq

我有一个具有以下结构的数据表:

Foo1    Foo2    Value
A       2       5
B       4       20
C       6       30
B       6       4
Run Code Online (Sandbox Code Playgroud)

我还有一个列表,如下所示:

Foobar
    Foo1
        A
        B
        Other
    Foo2
        4
        6
        Other
Run Code Online (Sandbox Code Playgroud)

(注意.在foobar中将有未知数量的列/条目)

我需要遍历我的列表,并为每个元素找到数据表中与子元素值匹配的平均值.例如,在Foo1中,数据表中A的平均值为5,B - 17.5,其他 - 30.

Foobar
    Foo1
        A (average is 5)
        B (average is 17.5)
        Other (average is 30)
    Foo2
        4 (average is 20)
        6 (average is 17)
        Other (average is 5)
Run Code Online (Sandbox Code Playgroud)

实际上,数据表有大约50列和一些大量的行.我对SQL/LINQ缺乏经验,所以我不确定如何以一种不太慢的方式解决这个问题.特别是对于"其他"桶.我当前的策略是只做一个嵌套的foreach,然后是LINQ查询来选择与当前子元素匹配的值,并进行平均.像这样的东西:

foreach (var foo in foobar)
{
    foreach (var bucket in foo.buckets) 
    {
        var hits = myDataTable.Where(n => n[foo.name].ToString() == bucket.name);
            if (hits.Any())
            {
                bucket.average = hits.Select(x => x["Value"]).Average();
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这很慢.那是因为这是在LINQ,还是因为我这样做的方式很差?

编辑

我做了一些改进速度,但仍然很慢.

foreach (var foo in foobar)
{
    var pairs = myDataTable.Select(
        n => new {Name = n[foo.name], Value = n["Value"]});

    foreach (var bucket in foo)
    {
        var temp = pairs.Where(n => bucket.name == n.Name);
        bucket.average = temp.Any() ? temp.Select(x => x.Value).Average() : 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ron*_*dau 5

它非常慢,因为每次到达最里面的行时都会进行查询,所以不是在1个查询中获得所需的一切,而是在数据库中来回进行N次查询(N为foobar.Count*foo. buckets.Count)

这不是你的整个代码(将东西存储到局部变量中并且不做任何事情)请发布你的整个方法,我很乐意为你提供更快的替代方案.