По сути, вам нужно создать Expression<Func<Login, bool>>
, который собирает ассоциированного пользователя из логина и затем применяет существующий предикат IsSuperhero
к этому пользователю.Канонический способ сделать это - использовать Expression.Invoke
в выражении «в составе» (в данном случае IsSuperHero
), заменив его параметры соответствующими аргументами.
К сожалению, такой подход довольно сложен длярука.Хуже того, многим поставщикам LINQ, таким как LINQ to Entities, вообще не нравится такой подход «выражение внутри выражения».Чтобы обойти это, нужно «встроить» вызванное выражение в большее выражение, чтобы оно выглядело как single , гигантское дерево выражений.
К счастью, есть удобныйбиблиотека LINQKit , которая может помочь с этим:
#region LINQKit Magic
Expression<Func<Login, bool>> predicate = login => IsSuperHero.Invoke(login.User);
var expandedPredicate = predicate.Expand();
#endregion LINQKit Magic
var loginsBySuperheroes = workspace.GetDataSource<Login>().Where(expandedPredicate);