事实上,这与这篇文章的问题是一样的:
How can I make sure my LINQ queries execute when called in my DAL, not in a delayed fashion?
但是,由于他没有解释他为什么要这样做,这个问题似乎被略过了一些。下面是我类似但解释得更好的问题:
我有两种类型的几个线程(暂时忽略UI线程)。有一个“数据收集”线程类型,和一个“计算”线程类型。数据收集线程很慢。有相当多的数据需要从不同的地方筛选。计算线程相对较快。到目前为止,设计模型是将数据收集线程发送出去,以查找数据,当它们完成时,将数据传递给计算。
当我在Linq中对数据收集进行编码时,我最后把一些缓慢的东西重新放到了计算线程中。现在有一些数据元素直到它们在计算过程中被使用才能得到完全的解决--这是一个问题。
我想强迫Linq在给定的时间内完成它的工作(语句结束?方法的终结?“请结束吧,该死的”方法调用),这样我就知道我以后不会付钱了。将".ToList()“添加到Linq的末尾是1.尴尬,2.感觉就像在另一个线程中暂时解封的东西。
发布于 2009-06-30 06:42:11
你不会对任何东西进行拳击-你会缓冲结果的。
如果你真的想要数据的话,使用ToList()
基本上是可行的。除非你准备好立即使用这些数据,否则它必须在某个地方被缓冲,不是吗?一张清单只是一种方便的方法。
另一种方法是在此时和那里进行处理--热切地使用数据,就像您生产数据一样。我不太了解事情的不同线索,所以我不清楚这是否对你有帮助,但就我所能看到的来说,这些基本上都是你可以选择的。
实际上,在您的描述中,这一点是比较明确的:
到目前为止的设计模型是将数据收集线程发送出去以查找数据,当它们完成时,将数据传递给计算。
调用ToList()
基本上会将您从“查询”返回的内容从“查询”更改为“数据本身,在列表中缓冲”。
发布于 2009-06-30 06:42:14
你能解释一下为什么.ToList是不可接受的吗?您提到了拳击和取消装箱,但这些都是完全不相关的主题。
强制LINQ查询按需完成的一部分需要存储结果。否则,为了再次查看结果,您必须重新处理查询。.ToList通过将元素存储在List<T>
中有效地实现了这一点。
可以将元素存储在几乎任何其他收集风格的数据结构中,并具有更好地满足您需要的各种权衡。
发布于 2009-06-30 06:42:49
LoadOptions
类中有一个DataContext
属性,可以帮助您更急切地获取数据。
否则,你可以使用一些聪明的放置ToList()
。
https://stackoverflow.com/questions/1064043
复制