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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое создание where 
V
    Опции темы
Greeneyed
Дата 24.2.2011, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Есть запрос 


Код

var values = db.ValueOfSystemReference.Where(v => v.idAttribute == attr.id 
                                                                            && SqlMethods.Like( v.Value.ToString(), "%"+ cityName.ToString() + "%" )
                                                                            ).ToList();


Он находит все города, которые LIKE '%cityName%'.

А мне нужно сделать, что он сравнивал с несколькими именами.  LIKE '%cityNam1e%' OR  LIKE '%cityName2%' OR  LIKE '%cityName3%' и т.д.
Количество имен, естественно, заранее не известно. Есть Expression Trees, с помощью которых можно сделать динамически лямбда-выражения, но как этим чудом пользоваться я не понял.
PM MAIL   Вверх
jonie
Дата 25.2.2011, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



что насчет DLINQ ?


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Greeneyed
Дата 25.2.2011, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не пробовал. И, честно говоря, не знаю как его прикрутить и юзать.
В общем нашел вот такой класс.

Код

 public static class PredicateBuilder
    {
        public static Expression<Func<T, bool>> True<T>() { return f => true; }
        public static Expression<Func<T, bool>> False<T>() { return f => false; }

        public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> expr1,
                                                            Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
        }

        public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expr1,
                                                             Expression<Func<T, bool>> expr2)
        {
            var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
            return Expression.Lambda<Func<T, bool>>
                  (Expression.AndAlso(expr1.Body, invokedExpr), expr1.Parameters);
        }
    }


Которым пользоваться надо вот так

Код

                        var predicate = PredicateBuilder.False<ValueOfSystemReference>();
                        foreach (var word in wordsOfCityName)
                        {
                            predicate = predicate.Or(v => SqlMethods.Like(v.Value.ToString(), "%" + word + "%"));
                        }
                        predicate = predicate.And(v => v.idAttribute == attr.id);
                        
                        var values = db.ValueOfSystemReference.Where(predicate);


Добавлено через 25 секунд
Так что тему можно закрывать.
PM MAIL   Вверх
v00d00
Дата 10.6.2011, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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


 




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


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

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