Получить количество IQueryable <T> - PullRequest
0 голосов
/ 15 февраля 2011

Предположим, у нас есть следующая коллекция

 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.
      ...
 }

Как узнать количество исходной коллекции (без применения подзапросов Skip и Take) запроса в SomeMethod.* Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2011

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

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 голосов
/ 15 февраля 2011

list.Count должен возвращать счет исходного списка

...