Как мне очистить эту лямбду?

У меня есть выражение, которое я использую несколько раз в нескольких запросах LINQ, поэтому я выделил его в собственный метод, который возвращает выражение. Лямбда-часть функции выглядит неаккуратно. Кто-нибудь хочет попробовать его в рефакторинге и сделать его более читабельным и / или меньшим?

    private Expression> UserSelector(string username, bool sent)
    {
        return x => ((sent ? x.FromUser : x.ToUser).Username.ToLower() == username.ToLower()) && (sent ? !x.SenderDeleted : !x.RecipientDeleted);
    }

Краткое описание того, что он делает, на английском языке - это проверка логического значения sent и проверка либо Message.FromUser или Сообщение. ToUser на основе этого логического значения.

Если пользователь просматривает свой почтовый ящик, отправлено истинно, и он увидит, если x.FromUser.Username == username ] и x.SenderDeleted == false .

Если пользователь просматривает свой почтовый ящик, он выполняет ту же логику, но отправлено ложно и проверяет x.ToUser и x.RecipientDeleted вместо этого.

Может быть, это самый простой способ, но я открыт для некоторого рефакторинга.

ОТВЕТИТЬ ИЗМЕНИТЬ

Мне очень понравился ответ Davy8, но я решил воспользоваться сделайте два выражения вместо одного выражения с вложенной функцией. Теперь у меня есть следующие методы:

    /// 
    /// Expression to determine if a message belongs to a user.
    /// 
    /// The name of the user.
    /// True if retrieving sent messages.
    /// An expression to be used in a LINQ query.
    private Expression> MessageBelongsToUser(string username, bool sent)
    {
        return x => (sent ? x.FromUser : x.ToUser).Username.Equals(username, StringComparison.OrdinalIgnoreCase);
    }

    /// 
    /// Expression to determine if a message has been deleted by the user.
    /// 
    /// The name of the user.
    /// True if retrieving sent messages.
    /// An expression to be used in a LINQ query.
    private Expression> UserDidNotDeleteMessage(string username, bool sent)
    {
        return x => sent ? !x.SenderDeleted : !x.RecipientDeleted;
    }

Итак, теперь мои запросы выглядят так:

    /// 
    /// Retrieves a list of messages from the data context for a user.
    /// 
    /// The name of the user.
    /// The page number.
    /// The number of items to display per page.
    /// True if retrieving sent messages.
    /// An enumerable list of messages.
    public IEnumerable GetMessagesBy_Username(string username, int page, int itemsPerPage, bool sent)
    {
        var query = _dataContext.Messages
            .Where(MessageBelongsToUser(username, sent))
            .Where(UserDidNotDeleteMessage(username, sent))
            .OrderByDescending(x => x.SentDate)
            .Skip(itemsPerPage * (page - 1))
            .Take(itemsPerPage);
        return query;
    }

    /// 
    /// Retrieves the total number of messages for the user.
    /// 
    /// The name of the user.
    /// True if retrieving the number of messages sent.
    /// The total number of messages.
    public int GetMessageCountBy_Username(string username, bool sent)
    {
        var query = _dataContext.Messages
            .Where(MessageBelongsToUser(username, sent))
            .Where(UserDidNotDeleteMessage(username, sent))
            .Count();
        return query;
    }

Я бы сказал, что это очень читаемые запросы на английском языке, спасибо, ребята!

Ссылка: http: //www.codetunnel.com/blog/post/64/how-to-simplify-complex-linq-expressions[12149 provided

5
задан Chev 26 May 2011 в 20:25
поделиться