Где выполнить дополнительную логику для запроса linq к объектам? - PullRequest
0 голосов
/ 16 марта 2010

Допустим, я хочу заполнить список CustomerViewModel, созданный на основе модели Customer Entity Framework, с некоторыми полями (например, Balance), рассчитанными отдельно.

Ниже у меня есть код, который работает для списков - он реализован на моем сервисном уровне, но я также хочу выполнить этот код, когда я просто получаю один элемент из базы данных и выполняю также в разных сервисах, к которым я обращаюсь Данные клиентов также.

Как мне это сделать, чтобы обеспечить производительность, чтобы не дублировать код - тот, который используется для расчета баланса?

public List<CustomerViewModel> GetCustomerViewModelList()
{
    IQueryable<CustomerViewModel> list = from k in _customerRepository.List()
    select new CustomerViewModel
    {
        Id = k.Id,
        Name = k.Name,
        Balance =
        k.Event.Where(z => z.EventType == (int) EventTypes.Income).Sum(z => z.Amount)
    };
    return list.ToList();
}

1 Ответ

2 голосов
/ 16 марта 2010

Попробуйте это в своем бизнес (сервисном) слое:

private List<CustomerViewModel> GetCustomerViewModelList(IQueryable<Customer> customerList)
{
    vaar list = from k in customerList
    select new CustomerViewModel
    {
        Id = k.Id,
        Name = k.Name,
        Balance =
            k.Event.Where(z => z.EventType == (int) EventTypes.Income).Sum(z => z.Amount)
    };
    return list.ToList();
}

public List<CustomerViewModel> GetCustomerViewModelListForAllCustomers
{   
    return GetCustomerViewModelList(_repository.List());
}

public CustomerViewModel GetCustomerViewModelListForOneCustomers(int id)
{   
    return GetCustomerViewModelList(_repository.List().Where(c => c.Id == id)).First();
}

_repository.List() должен вернуть IQueryable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...