2010-03-15 77 views
0

假设我想填充基于客户实体框架模型构建的CustomerViewModel的列表,其中一些字段(如余额)单独计算。在哪里执行LINQ到实体查询的额外逻辑?

下面我有用于列表的代码 - 它是在我的服务层实现的,但是当我从数据库中获取一个项目并执行时,我想执行此代码,以及在不同的服务中访问客户数据。

我应该怎么做才能确保性能,而不是重复代码 - 用于计算平衡的代码?

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(); 
} 

回答

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的。