Where子句不进入lambda

时间:2013-05-22 19:10:32

标签: c# linq lambda

我有以下lambda

var entities = JTransformer.Queryer.GetList()
  .Where(x => { var y = JStubs.GetType(x.Name); 
    return (y.Impliments(baseType) && y.IsGenericType); });

我在我创建的JStub.GetType函数中设置了一个断点,但每次尝试运行该语句时都无法触及它。

JTransformer.Queryer.GetList()正在返回一个Enumerable,我已经检查过以确保它有值

-       Results View    Expanding the Results View will enumerate the IEnumerable   
+       [0] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [1] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [2] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [3] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [4] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [5] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [6] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}
+       [7] {JsonMap.Default.Types.JEntity} JsonMap.Interfaces.IEntity {JsonMap.Default.Types.JEntity}

那为什么我的lambda永远不会被运行?

编辑:

我应该澄清一下。我后来在实体上做了for-each,它没有任何东西可以迭代。

foreach (var entity in entities)
{
    (some code never get's hit)
}

但是当我执行以下操作时

var entities = JTransformer.Queryer.GetList().ToList()
    .Where(x => { var y = JStubs.GetType(x.Name); 
        return (y.Impliments(baseType) && y.IsGenericType); });

所有突然的实体都有值,for-each中的代码被点击

2 个答案:

答案 0 :(得分:1)

在这种情况下,实体一个集合。这是一个返回集合的延迟调用。

那里存在轻微的语义差异,当你考虑使用产生无限大小的IEnumerables时更加明显。例如

public IEnumerable<int> InfiniteRepeat(int i)
{
    do
    {
        yield return i;
    } while (true);
}

正如您所看到的,您实际上永远不会存储该集合。如果您要调用InfiniteRepeat(1).ToList(),则会抛出OutOfMemoryException。

您的案例似乎相似。您有某种查询,当您尝试在调试模式下检查值时会执行该查询,但在运行时,没有任何查询。调用ToList()强制IEnumerable将内容加载到内存(列表)中,这会强制评估IEnumerable。

答案 1 :(得分:0)

您必须使用.ToList().ToArray()或在导致“实际”执行枚举的for-each内进行迭代。除了创建Func引用之外,它本身不会做任何事情。