19

事实上,这和这篇文章是同一个问题:

如何确保我的 LINQ 查询在 DAL 中调用时执行,而不是以延迟方式执行?

但既然他没有解释他为什么想要它,这个问题似乎已经被忽略了一点。这是我的类似但更好解释的问题:

我有两种类型的少数线程(暂时忽略 UI 线程)。有一个“数据收集”线程类型和一个“计算”线程类型。数据收集线程很慢。有相当多的数据需要从各个地方进行筛选。计算线程相对较快。到目前为止的设计模型是将数据收集线程发送出去以查找数据,并在完成后将数据传递给计算。

当我在 Linq 中编码我的数据收集时,我最终将一些缓慢提升到我的计算线程中。现在有一些数据元素在计算过程中使用之前没有得到完全解决——这是一个问题。

我想强制 Linq 在给定时间完成它的工作(语句结束?方法结束?“请结束,该死的”方法调用),以便我知道我以后不会为此付费。将“.ToList()”添加到 Linq 的末尾是 1. 尴尬,并且 2. 感觉就像装箱一些即将在另一个线程中拆箱的东西。

4

4 回答 4

24

你不会对任何东西进行拳击——你会缓冲结果。

如果你真的想要数据,使用ToList()基本上是要走的路。除非您准备好立即使用数据,否则它必须在某个地方缓冲,不是吗?列表只是一种方便的方法。

另一种方法是在当时和那里进行处理 - 急切地使用生成的数据。我并没有完全遵循事物的不同线程方面,所以我不清楚这是否会对你有所帮助,但据我所知,这些基本上是你可用的选择。

这实际上在您的描述中有些明确:

到目前为止的设计模型是将数据收集线程发送出去以查找数据,并在完成后将数据传递给计算。

调用ToList()基本上会将您返回的内容从“可以在被要求时获取数据的查询”更改为“数据本身,缓冲在列表中”。

于 2009-06-30T14:42:11.717 回答
7

你能解释一下为什么 .ToList 是不可接受的吗?您提到了装箱和拆箱,但这些是完全不相关的主题。

强制 LINQ 查询按需完成的一部分需要存储结果。否则,为了再次查看结果,您必须重新处理查询。.ToList 通过将元素存储在 .ToList 中有效地实现了这一点List<T>

可以将元素存储在几乎任何其他集合样式的数据结构中,并进行各种权衡,以更好地满足您的需求。

于 2009-06-30T14:42:14.040 回答
0

类中有一个LoadOptions属性DataContext可以帮助您更急切地获取数据。

否则,您可以使用一些巧妙放置ToList()的 's。

于 2009-06-30T14:42:49.140 回答
-6

我知道这个线程很旧......无论如何,有趣的没有人提到 .ToLast() 呢。我正在做一些事情,其中​​ linq 只不过是一个美化的 foreach 驱动一些副作用,而我并不真正关心查询结果......所以我不想分配任何不必要的虚假内存。

于 2011-02-09T22:41:41.167 回答