Expression<Func<T1, T2, bool>> -> Expression<Func<T1, bool>>
От: lazymf Россия  
Дата: 13.11.10 11:55
Оценка:
Добрый день.

У меня есть Expression<Func<T1, T2, bool>> и экземпляр T2. Мне нужно получить Expression<Func<T1, bool>> с имеющимся экземпляром T2 "зашитым" внутрь. Есть ли простой способ сделать это? (Сложный я, кажется, знаю).
Re: Expression<Func<T1, T2, bool>> -> Expression<Func<T1, bo
От: _FRED_ Черногория
Дата: 13.11.10 12:10
Оценка: 4 (1)
Здравствуйте, lazymf, Вы писали:

L>У меня есть Expression<Func<T1, T2, bool>> и экземпляр T2. Мне нужно получить Expression<Func<T1, bool>> с имеющимся экземпляром T2 "зашитым" внутрь. Есть ли простой способ сделать это? (Сложный я, кажется, знаю).


Вот тут
Автор: _FRED_
Дата: 11.08.10
есть ReplaceVisitor
  Скрытый текст
    private sealed class ReplaceVisitor : ExpressionVisitor
    {
      public ReplaceVisitor(Expression what, Expression to) {
        if(what == null) {
          throw new ArgumentNullException("what");
        } else if(to == null) {
          throw new ArgumentNullException("to");
        }//if


        What = what;
        To = to;
      }

      public Expression What { get; private set; }
      public Expression To { get; private set; }

      public override Expression Visit(Expression node) {
        if(node == What) {
          return To;
        }//if

        return base.Visit(node);
      }
    }

На первый взгляд кажется, что больше ничего и не нужно надо заменить второй параметр на "имеющийся экземпляр T2".
Help will always be given at Hogwarts to those who ask for it.
Re[2]: Expression<Func<T1, T2, bool>> -> Expression<Func<T1,
От: lazymf Россия  
Дата: 13.11.10 12:18
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, lazymf, Вы писали:


L>>У меня есть Expression<Func<T1, T2, bool>> и экземпляр T2. Мне нужно получить Expression<Func<T1, bool>> с имеющимся экземпляром T2 "зашитым" внутрь. Есть ли простой способ сделать это? (Сложный я, кажется, знаю).


_FR>На первый взгляд кажется, что больше ничего и не нужно надо заменить второй параметр на "имеющийся экземпляр T2".


Спасибо, это то, что я имел в виду под "сложным" способом Уже заработал вот этот вариант — http://stackoverflow.com/questions/3157905/convert-expressionfunct-t2-bool-to-expressionfunct2-bool-by-introducin (Вообще он и мне в голову приходил, но я почему-то был уверен, что Linq To SQL ломается на выражениях, содержащих Invoke — как выяснилось не ломается).
Re[3]: Expression<Func<T1, T2, bool>> -> Expression<Func<T1,
От: _FRED_ Черногория
Дата: 13.11.10 12:39
Оценка:
Здравствуйте, lazymf, Вы писали:

L>>>У меня есть Expression<Func<T1, T2, bool>> и экземпляр T2. Мне нужно получить Expression<Func<T1, bool>> с имеющимся экземпляром T2 "зашитым" внутрь. Есть ли простой способ сделать это? (Сложный я, кажется, знаю).

_FR>>На первый взгляд кажется, что больше ничего и не нужно надо заменить второй параметр на "имеющийся экземпляр T2".

L>Спасибо, это то, что я имел в виду под "сложным" способом


А я уж подумал что "сложный" — это действительно какой-то сложный

L>Уже заработал вот этот вариант — http://stackoverflow.com/questions/3157905/convert-expressionfunct-t2-bool-to-expressionfunct2-bool-by-introducin (Вообще он и мне в голову приходил, но я почему-то был уверен, что Linq To SQL ломается на выражениях, содержащих Invoke — как выяснилось не ломается).


ИМХО, это менее "чисто". Но, если у вас там и "Linq To SQL" ещё… а он, анализируя выражения, исправляет этот Инвок на то, что нужно?
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Expression<Func<T1, T2, bool>> -> Expression<Func<T1,
От: lazymf Россия  
Дата: 13.11.10 12:57
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>ИМХО, это менее "чисто". Но, если у вас там и "Linq To SQL" ещё… а он, анализируя выражения, исправляет этот Инвок на то, что нужно?


Ну, пока там ничего сложнее (x, y) => x.ParentId == y.Id не было, для таких выражений SQL судя по трейсу генерируется корректный. А почему менее чисто?
Re[5]: Expression<Func<T1, T2, bool>> -> Expression<Func<T1,
От: _FRED_ Черногория
Дата: 13.11.10 13:11
Оценка:
Здравствуйте, lazymf, Вы писали:

_FR>>ИМХО, это менее "чисто".

L>А почему менее чисто?

Ну так первый способ позволяет обойтись без [лишнего, не необходимого] косвенного вызова. Способ через визитор позволяет получить в точности оригинальное выражение только с самой необходимой минимальной заменой. Второй же способ возвращает другое выражение, параметризующее первое.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.