Мы пытаемся найти обходной путь для проблемы, заключающейся в том, что Entity Framework не поддерживает нескалярные объекты. Мы используем определенное равенство, поэтому мы пытаемся создать выражение, которое для данного входа и функции из этого входа проверяет, выполняется ли это равенство.
private static Expression<Func<TElement, bool>> UserEquals<TElement>(User user, Func<TElement, User> select)
{
var userequals = (Expression<Func<User, Boolean>>) (u => u.Source == user.Source && u.UserName == user.UserName);
//return an Expression that receives an TElement, applies |select| and then passes that result to then `userequals` expression
// and uses it's result as return value.
}
Я подозреваю, что это включает создание нового выражения, которое получает параметр, но я не могу понять, как применить функцию select
к этому входу, а затем передать результат этого в выражение userequals
.
Предполагаемое использование что-то вроде:
Context.Foo.Where(UserEquals(user, (f => f.User)).Single(f => f.Id == id);
Вместо:
Context.Foo.Single(f => f.Id == id && f.User.Source == user.Source && f.User.UserName == user.UserName);
В идеале мы хотели бы написать что-то вроде:
Context.Foo.Single(f => f.Id == id && f.User.Equals(user))
// or
Context.Foo.Single(f => f.Id == id && f.User == user)