2015-11-30 2 views
2

Я ищу инкапсуляцию раздела Select GroupBy, чтобы иметь более читаемый, понятный и приятный код. Так или иначе?Инкапсулировать LINQ GroupBy Выбрать

Это то, что я сейчас (и у меня есть много GroupsBy в моем коде, это не только один, это еще одна причина, чтобы инкапсулировать как можно больше):

var xTypeAggregatedTransactions = xTypeTrtansactions. 
        .GroupBy(x => new {x.TypeId, x.AccountId}) 
        .Select(y => new PayTransactionsCommand 
        { 
         Id = Guid.NewGuid(), 
         Narration = item.Name, 
         AccountId = y.Key.AccountId, 
         Credit = y.Sum(z => z.Credit), 
        }); 

Это то, что я хочу :

var xTypeAggregatedTransactions = xTypeTrtansactions. 
            .GroupBy(x => new {x.TypeId, x.AccountId}) 
            .AsEnumerable().ToPayTransaction(); 

Благодаря

+1

Не думайте, что это возможно, из-за анонимных типов, которые вы используете для группировки. Вы можете попробовать сделать некоторые вещи, основанные на отражении, и создать Manage Expression Tree, но не видите, что это простое решение. – MarcinJuraszek

+0

Проблема в том, что 'new {x.TypeId, x.AccountId}' является анонимным типом, поэтому вы не можете передать его методу, который будет знать, что с ним делать ... –

+0

Что такое 'item' в это? –

ответ

1

Написать класс расширения:

public static class TypeTrtansactionExtensions 
{ 
    public static IEnumerable<PayTransactionsCommand> ToPayTransaction(this IQueryable<TypeTrtansaction> query, string itemName) 
    { 
     return query.GroupBy(x => new { x.TypeId, x.AccountId }) 
       .Select(y => new PayTransactionsCommand 
       { 
        Id = Guid.NewGuid(), 
        Narration = itemName, 
        AccountId = y.Key.AccountId, 
        Credit = y.Sum(z => z.Credit), 
       }); 
    } 
} 

И называют это:

var xTypeAggregatedTransactions = xTypeTrtansactions.ToPayTransaction(item.Name); 

Кроме того, вы можете добавить дополнительные параметры, если вам нужно.

+0

. Я думал об этом раньше, но я хотел знать, есть ли там какой-либо другой способ сделать это. Во всяком случае, я буду отмечать это как ответ, потому что похоже, что для этого нет другого решения! Спасибо –

+0

@ TomásEscamez этот путь является самым распространенным – Backs

+0

Я, наконец, пошел на этот вариант, спасибо @Backs. Просто немного деталей, здесь нет необходимости использовать .AsEnumerable(), если вы читаете, избегайте этого! –