Деревья выражений Linq и логика фильтрации

#c# #linq-expressions

#c# #linq-выражения

Вопрос:

Я новичок в выражениях Linq.

Я вызываю API, который предоставляет следующие перегруженные методы:

 CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, OrderBy orderBy = OrderBy.Ascending);

CustomPaging<TEntity> GetAll(int index, int maxPage, Expression<Func<TEntity, int>> keySelector, Expression<Func<TEntity, bool>> predicate, OrderBy orderBy, params Expression<Func<TEntity, object>>[] useProperties)
  

Я намереваюсь передать параметр «id» как часть предиката для фильтрации по переданному значению.

Что-то вроде:

 x => x.UserId.Equals(id)
  

Мой вопрос — можно ли определить по сигнатуре метода API, как добиться этой фильтрации?

Я поиграл с передачей вариантов следующего, но безрезультатно:

  Expression<Func<Group, int>> myFunc = u => u.UserId == id
  

Ошибка: не удается преобразовать bool в int.

 Func<Group, int> myFunc = g => g.UserId == id;
  

Ошибка: не удается выполнить преобразование из системы.Функция для
System.Linq.Выражения.Выражение

Я, очевидно, не очень хорошо понимаю деревья выражений и мог бы использовать некоторые дружеские рекомендации. Заранее спасибо за любую информацию.

Комментарии:

1. Вам следует взглянуть на конструктор предикатов Джозефа Албахари. albahari.com/nutshell/predicatebuilder.aspx

2. u.UserId == id возвращает логическое значение и Expression<Func<Group, int>> ожидает int возвращаемый тип. Вы просто путаетесь с параметрами, keySelector это не параметр, отвечающий за фильтрацию, это следующий параметр с именем predicate

Ответ №1:

Параметр perdicate type Expression<Func<TEntity, bool>> — это параметр, отвечающий за фильтрацию:

 Expression<Func<Group, bool>> myFunc = u => u.UserId == id;
  

Вам нужно сопоставить сигнатуру <Group, bool> и не <Group, int>

Заключительный вызов может быть:

 var results = GetAll(someIndex, someMaxPage, x=> x.UserId, u => u.UserId == id);
  

или:

 Expression<Func<Group, int>> myKeySelector = u => u.UserId;
Expression<Func<Group, bool>> myFilter = u => u.UserId == id;
var results = GetAll(someIndex, someMaxPage, myKeySelector, myFunc );
  

Комментарии:

1. Это Expression<Func<Group, bool>> не Expression<Func<Group, int>>

2. @LucasTrzesniewski Правильно. Обновлено.

3. Не похоже, что в OP используется оператор присваивания. Может быть, редактирование ниндзя?

4. Я имею в виду, что этот вопрос по- прежнему остается без ответа — сообщение об ошибке не соответствует коду, и OP, похоже, не знает, что он делает. Скорее всего, ему просто нужно u => u.UserId указать имя keySelector переменной.

5. @LucasTrzesniewski Он просто запутался, какой параметр отвечает за фильтрацию. Я думаю, это все. Ответ обновлен!