LINQ查询在将.ToArray()放在from/in内部时性能较差。

14 浏览
0 Comments

LINQ查询在将.ToArray()放在from/in内部时性能较差。

这个问题已经在这里有了答案:

返回 IEnumerable vs. IQueryable

EF ICollection vs List vs IEnumerable vs IQueryable

// the following approach takes sooooooo long
var result = (
    from t in (
        from a in ctx.t1
        from b in ctx.t2
        where a.id == b.id
        select new { a, b }
    ).ToArray()
    from c in ctx.t3.ToArray()
    where c.name.Contains(t.a.name)
    select new { t.a, t.b, c }
).ToArray();
// while the following approach takes time in seconds
var tSet = (
    from a in ctx.t1
    from b in ctx.t2
    where a.id == b.id
    select new { a, b }
).ToArray();
var cSet = ctx.t3.ToArray();
var result = (
    from t in tSet
    from c in cSet 
    where c.name.Contains(t.a.name)
    select new { t.a, t.b, c }
).ToArray();

请考虑上述代码。就我所知,这两种方法与数据集 (t1t2) 以及两种方法中的 t3 在应用 \"second\" 子句之前都将被计算。

然而,实际情况是第一种方法比第二种方法慢得多。我可以知道为什么吗?

预先感谢你。

admin 更改状态以发布 2023年5月21日
0
0 Comments

当你枚举你的数据时(调用ToArray、ToList等方法),那些数据必须首先从数据库提取。把这些以及其他未在数据库中实现(作为本地操作或存储过程)的枚举方法视为你的数据库交易的结束。

你应该尽可能推迟枚举数据。

0