Предположим, что мне определили объект объекта как
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
Повторное использование деревьев выражений - черное искусство; вы можете это сделать, но вам нужно будет переключить много кода на отражение, и вы потеряете все статические проверки. В частности, работа с анонимными типами становится кошмаром (хотя динамический
в 4.0 может работать).
Кроме того, если вы обманываете и используете Expression.Invoke
, то он поддерживается не всеми поставщиками (особенно заметно не в EF в .NET 3.5SP1).
Если это не основная проблема, я бы оставил это дублированием. Или вам нужен , чтобы повторно использовать дерево выражений?