其实这个问题和这篇文章是同一个问题:

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

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

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

当我在 Linq 中对数据收集进行编码时,我最终发现了一些缓慢的情况 回到我的计算线程. 。现在有些数据元素只有在计算过程中使用时才能得到完全解析——这就是一个问题。

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

有帮助吗?

解决方案

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

使用 ToList() 如果您确实想要数据,基本上就是要走的路。除非您准备好立即使用数据,否则必须对其进行缓冲 某处, ,不是吗?列表只是一种方便的方法。

另一种方法是当场进行处理——在生成数据时立即使用数据。我没有完全遵循事物的不同线程方面,所以我不清楚这是否会对您有帮助,但据我所知,这些基本上是您可以选择的。

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

到目前为止,设计模型是发送数据收集线程以查找数据,并且当它们完整时,将数据传递给数据以进行计算。

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

其他提示

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

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

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

有一个 LoadOptions 财产在 DataContext 类可以帮助您更快速地获取数据。

否则你可以使用一些巧妙的放置 ToList() 的。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top