2011-02-15 64 views
0

获取数假设我们有以下的集合的一个IQueryable <T>

IEnumerable<int> list = new List<int> { 11, 12, 13, 14, 15, 16, 17, 18, 19, 10 }; 
var query = list.Skip(5).Take(4); 
SomeMethod(query.AsQueryable()); 
. 
. 
. 
public void SomeMethod(IQueryable<T> query) 
{ 
     var collectionCount = ????? // count should be 10 not 4. 
     ... 
} 

我怎样才能得到原始采集的数量(不应用跳过和取子查询)中的someMethod查询。

谢谢。

回答

0

没有办法,你可以(通过做一些铁杆反射的东西,除了可能)得到的信息的数量。这根本就不存在了。这就像你想从这样的提取原始计数:

var list = new List<int> { 11, 12, 13, 14, 15, 16, 17, 18, 19, 10 }; 
SomeMethod(list[3]); 

public void SomeMethod(int number) 
{ 
    var collectionCount = ????? // count should be 10 
    ... 
} 

我想你可能能够获得的信息如果不是IQueryable,你会通过Expression,然而,即使这种情况下也不会很简单。

新增每评论:

它并不像你想象的那么简单;我甚至不认为这是可能的完全一般。但是,对于一些有限的使用情况,它可能可能工作。我很快就剽窃了一种“删除”应用于查询的任何Skip a Take并返回原始计数的方法。试试看,YMMV:

public int CountOriginal<T>(IQueryable<T> query) 
{ 
    var ex = query.Expression; 
    while (ex.NodeType == ExpressionType.Call) 
    { 
     var call = (MethodCallExpression)ex; 

     if (call.Method.Name != "Skip" && call.Method.Name != "Take") break; 

     ex = call.Arguments[0]; 
    } 
    var enumerable = Expression.Lambda(ex).Compile().DynamicInvoke(null) as IEnumerable<T>; 
    if (enumerable == null) throw new NotImplementedException(); 
    return enumerable.Count(); 
} 
+0

纠正我,如果我错了,但据我所知,当你移动一个IQueryable时,你移动一个提供者和表达式。所以我认为可以在该提供程序上执行不同的查询。 – mrtaikandi 2011-02-15 11:54:29

0

list.Count应该返回原始列表

+0

我想在SomeMethod(IQueryable )方法中获得计数。 – mrtaikandi 2011-02-15 10:11:38

相关问题