在哪里为linq实体查询执行额外的逻辑?

时间:2010-03-15 21:50:01

标签: c# .net asp.net-mvc entity-framework

假设我想填充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 个答案:

答案 0 :(得分:2)

在您的业务(服务)层尝试此操作:

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。