Предположим, у меня есть объект сущности, определенный как
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 при выполнении выбора, что-то вроде:
using(MyEntities e = new MyEntities())
{
//get the current user id
int currentUserId = 0;
e.Articles.Select(a => new
{
Text = a.Text,
CanBeDeleted = ???
};
}
Но что бы я ни пытался, я не могу использовать выражение в методе выбора. Я думаю, что если я могу сделать
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)
};
но это тоже не сработает.
Есть идеи, как заставить это работать? Или, если это невозможно, каковы альтернативы повторного использования бизнес-логики в обоих местах?
Спасибо
Pedro