Группировка с параметром if с использованием структуры объекта - PullRequest
0 голосов
/ 22 января 2019

В моем сервисе есть параметр enum, и мне нужно сгруппировать по значению параметра

Я сейчас использую if и попробовал с switch

У моего свойства навигации есть свойство Name

Используя if или Switch, я дублирую свой код Select(x =>

Моя модель:

public class Bill
{
    public int Id {get;set;}

    public int CustomerId {get;set;}
    public Customer Customer {get;set;}

    public int BankAccountId {get;set;}
    public BankAccount BankAccount {get;set;}

    public int PlanId {get;set;}
    public Plan Plan {get;set;}

    public string Description {get;set;}
    public DateTime Date {get;set;}
    public decimal Amount {get;set;}
}

и мой сервис возвращает DTO

public class BillService
{
     public BillDTO ReturnGroupBy(BillGroup group)
     {
            if (group== BillGroup.Customer)
            {
                return dbo.Bill.GroupBy(c => c.Customer).Select(c => new BillDTO { Nome = c.Nome })..
            }
            if(group== BillGroup.BankAccount)
            {
                return dbo.Bill.GroupBy(c => conta.BankAccount).Select(c => new BillDTO { Nome = c.Nome })..
            }

}
}

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Вы можете объявить следующий класс

public static class CustomQueryableExtensions
{
    public static IQueryable<IGrouping<INamed, T>> GroupByNamed<T>(this IQueryable<T> query, BillGroup group)
    {
        //enum name must be the same as property name
        string property = group.ToString();

        ParameterExpression parameter = Expression.Parameter(typeof(T));
        Expression prop = Expression.Property(parameter, property);

        var lambda = Expression.Lambda<Func<T, INamed>>(prop, parameter);

        return query.GroupBy(lambda);
    }
}

С интерфейсом

public interface INamed
{
    string Name { get; set; }
}

И используйте это так

var bills = context
    .Users
    .GroupByNamed(BillGroup.Customer)
    .Select(u => new BillDTO { Name = u.Key.Name });

Обратите внимание, что в моем примере Класс пользователя должен содержать свойство Customer , и это свойство должно реализовывать интерфейс INamed .

В вашем случае классы Customer и BankAccount должны реализовать один и тот же интерфейс, содержащий свойство Nome , чтобы иметь возможность использовать это расширение, например,

dbo
    .Bill
    .GroupByNamed(BillGroup.Customer)
    .Select(c => new BillDTO { Nome = c.Key.Nome })..
0 голосов
/ 22 января 2019

Найдите общий знаменатель и объявите переменную этого типа, в данном случае IQueryable<Bill>:

IQueryable<Bill> groupedBills;

if (group == BillGroup.Customer)
{
    groupedBills = dbo.Bill.GroupBy(c => c.Customer);
}
else
{
    groupedBills = dbo.Bill.GroupBy(c => conta.BankAccount);
}

return groupedBills.Select(c => new BillDTO 
{ 
    Nome = c.Nome,
    // ...
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...