Нет способа получить информацию (за исключением, может быть, хардкорных размышлений). Его просто больше нет. Это как если бы вы хотели извлечь исходный счет из чего-то вроде этого:
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();
}