Динамически запускаемый метод IQueryable - PullRequest
0 голосов
/ 01 апреля 2010

Я пытаюсь запустить функцию Count () оператора Linq в переопределенной функции Gridview. По сути, я хочу иметь возможность назначить запрос linq для вида сетки, и на событии OnDataBound (e) в моем новом расширенном виде сетки он получает счетчик, используя IQueryable.

Итак, мне нужно динамически преобразовать GridView.DataSource в мой объект LinqToSql IQueryable, чтобы я мог выполнить для него функцию Count ().

Вот где я сейчас нахожусь:

protected override void OnDataBound(EventArgs e)
    {
        IEnumerable _data = null;
        if (this.DataSource is IQueryable)
        {
            _data = (IQueryable)this.DataSource;
        }
        System.Type dataSourceType = _data.GetType();
        System.Type dataItemType = typeof(object);
        if (dataSourceType.HasElementType)
        {
            dataItemType = dataSourceType.GetElementType();
        }
        else if (dataSourceType.IsGenericType)
        {
            dataItemType = dataSourceType.GetGenericArguments()[0];
        }
        else if (_data is IEnumerable)
        {
            IEnumerator dataEnumerator = _data.GetEnumerator();

            if (dataEnumerator.MoveNext() && dataEnumerator.Current != null)
            {
                dataItemType = dataEnumerator.Current.GetType();
            }
        }
        Object o = Activator.CreateInstance(dataItemType);
        object[] objArray = new object[] { o };
        RowCount = (int)dataSourceType.GetMethod("Count").Invoke(_data, objArray);

Есть идеи? Я действительно новичок в работе с IQueryables и Linq, так что я могу быть далеко. Как я могу получить свои _данные, чтобы я мог запустить функцию Count?

Ответы [ 2 ]

1 голос
/ 01 апреля 2010

Это, наверное, самый простой способ (и в некоторой степени связан с вашим собственным ответом):

protected override void OnDataBound(EventArgs e) {
    var count = 0;
    if (DataSource is IQueryable) {
        count = ((IQueryable)DataSource).OfType<object>().Count();
    }
    else {
        count = ((IEnumerable)DataSource).OfType<object>().Count();
    }

    // use count here
}

Если предположить, что провайдер запросов достаточно умен, чтобы игнорировать преобразование в object, это должно привести к запросу БД, чтобы получить счетчик, если источник действительно IQueryable.

0 голосов
/ 01 апреля 2010

изменить это

Object o = Activator.CreateInstance(dataItemType);
    object[] objArray = new object[] { o };
    RowCount = (int)dataSourceType.GetMethod("Count").Invoke(_data, objArray);

на это

RowCount = (int)_data.OfType<object>().Count();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...