代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

强制Linq不延迟执行

  •  18
  • Clinton Pierce  · 技术社区  · 17 年前

    事实上,这与本文的问题相同:

    How can I make sure my LINQ queries execute when called in my DAL, not in a delayed fashion?

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

    我有两种类型的线程(暂时忽略UI线程)。有一个“数据收集”线程类型和一个“计算”线程类型。数据收集线程速度较慢。有相当多的数据需要从不同的地方筛选出来。计算线程比较快。到目前为止的设计模型是发送数据收集线程以查找数据,当它们完成时,将数据传递给计算。

    当我在Linq中对数据收集进行编码时,我最终提升了一些速度慢的特性。 回到我的计算线程 . 现在有一些数据元素直到在计算过程中使用才得到完全解决——这是一个问题。

    我想强制Linq在给定的时间完成它的工作(语句结束?方法结束?“请完成,该死的“方法调用”),这样我就知道我以后不会为它付钱了。在linq的末尾添加“.tolist()”是1。尴尬,还有2。感觉像是在拳击什么东西,即将在另一个线程暂时解除绑定。

    4 回复  |  直到 17 年前
        1
  •  22
  •   Jon Skeet    17 年前

    你什么都不会拳击-你会缓冲结果。

    使用 ToList() 如果你真的想要这些数据的话,基本上就是这样。除非您准备立即使用数据,否则必须对其进行缓冲 在某处 是吗?清单只是一种方便的方法。

    另一种方法是在处理数据的同时,在生成数据的过程中,急切地使用数据。我并没有完全按照不同的思路去做,所以我不清楚这是否对你有帮助,但从我看来,这些基本上是你可以选择的。

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

    到目前为止的设计模型是 将数据收集线程发送到 查找数据,完成后 把数据传上来进行计算。

    打电话 托尔斯特() 基本上改变了从“当被要求获取数据的查询”返回到“列表中缓冲的数据本身”的内容。

        2
  •  7
  •   JaredPar    17 年前

    你能解释一下为什么托利斯是不能接受的吗?你提到拳击和拆箱,但这些都是完全无关的话题。

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

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

        3
  •  0
  •   leppie    17 年前

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

    否则你可以用一些巧妙的地方 ToList() s。

        4
  •  -6
  •   Brent Anderson    15 年前

    我知道这条线很旧…总之,有趣的是,还没有人提到.tolast()。 我正在做的事情中,Linq不仅仅是一个光荣的前臂,它会产生一些副作用,我并不真正关心查询结果…所以我不想分配比需要更多的伪内存。