如何确定IEnumerable是否已被评估?

时间:2013-10-22 13:10:22

标签: c# linq entity-framework

我想知道如何判断我的IEnumerable<T>是否已作为内存中的列表加载(即已经过评估)?

我希望此检查仅检查DateTime的日期部分以供查询:

private IEnumerable<AccDocumentItem> FilterDocumentItemDateFilter(IEnumerable<AccDocumentItem> accDocumentItems, FilterDocumentDate filterDocumentDate)
{   
    accDocumentItems =
    accDocumentItems.Where(x =>
            x.AccDocument.CreateDate >= filterDocumentDate.FromDocumentDate &&
            x.AccDocument.CreateDate <= filterDocumentDate.ToDocumentDate);
}

我知道在LinqToEntity我们可以使用EntityFunctions.TruncateTime,显然在LinqToObject我们可以获得DateTime的日期部分,但问题是我不知道是否我的IEnumerable是否已被执行?

修改 我想这样做:

private IEnumerable<AccDocumentItem> FilterDocumentItemDateFilter(IEnumerable<AccDocumentItem> accDocumentItems, FilterDocumentDate filterDocumentDate)
{   
    if(accDocumentItems as IList<AccDocumentItem> != null)
    {
        accDocumentItems =
    accDocumentItems.Where(x =>
            x.AccDocument.CreateDate.Date >= filterDocumentDate.FromDocumentDate &&
            x.AccDocument.CreateDate.Date <= filterDocumentDate.ToDocumentDate);
    }
    else
    {
        accDocumentItems =
    accDocumentItems.Where(x =>
            EntityFunctions.TruncateTime(x.AccDocument.CreateDate) >= filterDocumentDate.FromDocumentDate &&
            EntityFunctions.TruncateTime(x.AccDocument.CreateDate) <= filterDocumentDate.ToDocumentDate);
    }
}

(谢谢Tim Schmelter;)

3 个答案:

答案 0 :(得分:2)

因为IEnumerable是一个接口,所以你不知道它是如何实现的。即使您编写了枚举代码,并且在这种情况下您还没有,您仍然需要记住,在某些时候您可能会更改基础具体类型(到List,或Collection,或其他)。 ..

出于这个原因,你应该只依赖IEnumerable()本身提供的内容,而且我不相信它确实为你提供了任何有用的东西......所以你有点陷入困境我的观点。

答案 1 :(得分:0)

一种丑陋且容易出错的方式是:

var firstIterFirstItem = accDocumentItems.FirstOrDefault();
var secondIterFirstItem = accDocumentItems.FirstOrDefault();

var isEvaluated = firstIterFirstItem != null && ReferenceEquals(firstIterFirstItem, secondIterFirstItem);

仅适用于可枚举是实现结果的情况(选择等),而不是过滤。

答案 2 :(得分:-1)

您可以尝试使用as operator

进行投射
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
    // it is a list or array
}