Предположим, что у меня есть объект сущности, определенный как
public partial class Article
{
public Id
{
get;
set;
}
public Text
{
get;
set;
}
public UserId
{
get;
set;
}
}
Основываясь на некоторых свойствах статьи, мне нужно определить, может ли статья быть удалена данным пользователем. Поэтому я добавляю статический метод для проверки. Что-то вроде:
public partial class Article
{
public static Expression<Func<Article, bool>> CanBeDeletedBy(int userId)
{
//Add logic to be reused here
return a => a.UserId == userId;
}
}
Итак, теперь я могу сделать
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Where(Article.CanBeDeletedBy(currentUserid));
}
Пока все хорошо. Теперь я хочу повторно использовать логику в CanBeDeletedBy, делая Select, что-то вроде:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
Но независимо от того, что я пытаюсь, я не могу использовать выражение в методе select. Я предполагаю, что если я могу сделать
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = a => a.UserId == userId
};
Тогда я должен иметь возможность использовать одно и то же выражение. Пытался скомпилировать выражение и вызвать его, выполнив
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = Article.CanBeDeletedBy(currentUserId).Compile()(a)
};
но он не будет работать.
Любые идеи о том, как заставить это работать? Или, если это невозможно, каковы альтернативы повторного использования бизнес-логики в обоих местах?
Спасибо
Педро