Вы можете объявить следующий класс
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 })..