Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скомпилировать строку в делегат, Пропарсить строку в Func<T, object> 
V
    Опции темы
Лен
Дата 28.5.2009, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Есть private IQueryable<Т> Функция(IQueryable<Т> query, string параметр).
Задача: выполнить внутри функции строку return query.OrderBy(x => x.параметр);.
Вопрос: как красиво превратить строчку, полученную из String.Format("x => x.{0}", параметр) в собственно делегат вида Func<T, object>? На ум приходит только рефлексия с GetProperty+GetValue, но в конкретном случае не подойдёт из-за слишком низкой скорости.
PM MAIL   Вверх
Лен
Дата 28.5.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



Сделал и протестил рефлексию. Выглядит так:
Код

private IQueryable<Т> Функция(IQueryable<Т> query, string параметр)
{
  return query.OrderBy(x => typeof(T).GetProperty(параметр).GetValue(x, null));
}

Прилично работает на таблице в 200 записей. У заказчика - таблицы на 2-10 млн. записей. Есть ли более цивилизованный (т.е. быстрый) вариант???
З.Ы.: Боюсь, за этот меня повесят на трусах бухгалтера...
PM MAIL   Вверх
Idsa
Дата 28.5.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 5
Всего: 62



Лен, это Linq To Objects? Откуда на клиенте 2-10 млн записей?!
Уж не знаю, насколько это ускорит процесс, но typeof(T).GetProperty(параметр) можно вынести за пределы лямбды как инвариант.

Цитата(Лен @  28.5.2009,  16:23 Найти цитируемый пост)
З.Ы.: Боюсь, за этот меня повесят на трусах бухгалтера... 

Суровая контора... А за именование методов и переменных кириллическими символами мера наказания не предусмотрена? smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
PashaPash
Дата 28.5.2009, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 4
Всего: 49



Лен, 
Код

        private static IQueryable<T> OrderBySomeProperty<T, K>(IQueryable<T> query, string somePropertyName)
        {
            var parameter = Expression.Parameter(typeof(T), "x");
            var propertySelector = Expression.Property(parameter, somePropertyName);

            var labmda = Expression.Lambda<Func<T, K>>(propertySelector, parameter);

            return query.OrderBy(labmda);
        }

Более-менее рабочие наброски. Тип свойства вынесен в параметры. Можно добавить немного рефлекшена - вытягивать K из T, собирать тип лямбды из генерика, сделать нормальный метод расширения...но это уже как-нибудь без меня smile


--------------------
PM MAIL WWW   Вверх
Лен
Дата 28.5.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 20.1.2009

Репутация: нет
Всего: нет



PashaPash, огромное спасибо! Делегат там всегда один - Func<EntityT, object>. Работает, и без рефлексии - а что ещё кодеру для счастья надо?

Idsa, заказчик - нацбанк, и этим всё сказано. Таблицы на миллионы записей и выполняемые сутками хранимые процедуры прилагаются (как и мегатётки, ложащиеся своим 6-ым размером бюста на клаву - после чего приходит жалоба, что периодически в прогу вводится туева хуча посторонней фигни). Имена кириллицей я только в самоличных поделках использую - а здесь привёл просто так. На самом деле оно всё выглядит несколько по-иному, чем я привёл.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.