#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 Он просто запутался, какой параметр отвечает за фильтрацию. Я думаю, это все. Ответ обновлен!