C# 其中返回当前值为Null的WhereListIterator

C# 其中返回当前值为Null的WhereListIterator,c#,entity-framework,linq,C#,Entity Framework,Linq,我使用EntityFramework对DB进行了如下查询: var result = this.UnitOfWork.PatientProductGiveRepository.Find(x => x.ProductGroupId == pgId && ( x.ModificationDate != null && DateTime.Compare(x.ModificationDate.Value, la

我使用EntityFramework对DB进行了如下查询:

var result = this.UnitOfWork.PatientProductGiveRepository.Find(x =>
        x.ProductGroupId == pgId &&
        (
            x.ModificationDate != null && DateTime.Compare(x.ModificationDate.Value, lastTime) > 0 ||
            DateTime.Compare(x.CreationDate, lastTime) > 0
        ))
    .Result;
下面的一行我正试图只选择几行符合我的datetime需求:

var result2 = result.Where(x =>
    0 <= x.GiveDate.Subtract(curTime).TotalHours &&
    x.GiveDate.Subtract(curTime).TotalHours < 24);
var result2=result.Where(x=>

0 0
Current
在引用类型的任何新创建的迭代器上都为空。更一般地说,对于任何类型的迭代器
T
Current
在第一次调用其
MoveNext()
方法之前(或在调用
Reset()
之后),最初将等于
default(T)
。您可能从未直接调用过
MoveNext()
,但当您开始使用
foreach
循环枚举迭代器时,在后台会发生这种情况。对LINQ查询调用
ToList()
也会产生同样的效果,很可能是因为在其中的某个地方,有一个
foreach
循环

对于任何引用类型
T
default(T)
null

尝试对其进行迭代:

foreach (var x in result2) {
    //  Stuff
}
您的LINQ查询是“懒惰的”:
result2
不是结果的集合。它是一个迭代器,可以根据您的请求生成结果。顾名思义,
System.Linq.Enumerable。WhereListIterator
不是集合类型。但即使是这样,该集合的枚举器在您开始枚举它之前仍然没有当前项:

var items = new System.Collections.Generic.List<string> { "one", "two" };
var enumerator = items.GetEnumerator();
Console.WriteLine(enumerator.Current ?? "null");
输出:

Current == (null)
Next Item: Item 0
Next Item: Item 1
Next Item: Item 2
Next Item: Item 3

Current
在引用类型的任何新创建的迭代器上都为null。更一般地说,对于任何类型的迭代器
T
Current
在第一次调用其
MoveNext()
方法之前(或调用
Reset()
之后),最初将等于
default(T)
。您可能从未直接调用过
MoveNext()
,但当您开始使用
foreach
循环枚举迭代器时,在后台会发生这种情况。对LINQ查询调用
ToList()
也会产生同样的效果,很可能是因为在其中的某个地方,有一个
foreach
循环

对于任何引用类型
T
default(T)
null

尝试对其进行迭代:

foreach (var x in result2) {
    //  Stuff
}
您的LINQ查询是“懒惰的”:
result2
不是结果的集合。它是一个迭代器,可以根据您的请求生成结果。顾名思义,
System.Linq.Enumerable。WhereListIterator
不是集合类型。但即使是这样,该集合的枚举器在您开始枚举它之前仍然没有当前项:

var items = new System.Collections.Generic.List<string> { "one", "two" };
var enumerator = items.GetEnumerator();
Console.WriteLine(enumerator.Current ?? "null");
输出:

Current == (null)
Next Item: Item 0
Next Item: Item 1
Next Item: Item 2
Next Item: Item 3

您在第一段中是指引用类型,而不是值类型。@Evk-Ulp。谢谢!您在第一段中是指引用类型,而不是值类型。@Evk-Ulp。谢谢!