Снова используя Linq к Выражению Объектов <Func <T, TResult> в Выборе и Где вызовы

Предположим, что мне определили объект объекта как

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

13
задан Andrew Hare 15 March 2010 в 11:50
поделиться

1 ответ

Повторное использование деревьев выражений - черное искусство; вы можете это сделать, но вам нужно будет переключить много кода на отражение, и вы потеряете все статические проверки. В частности, работа с анонимными типами становится кошмаром (хотя динамический в 4.0 может работать).

Кроме того, если вы обманываете и используете Expression.Invoke , то он поддерживается не всеми поставщиками (особенно заметно не в EF в .NET 3.5SP1).

Если это не основная проблема, я бы оставил это дублированием. Или вам нужен , чтобы повторно использовать дерево выражений?

4
ответ дан 2 December 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: