2014-04-26 24 views
1

我想要使用实体框架查询数据库,并且我需要在同一组表上查询几个不同的查询。我需要添加一些导航属性,我认为我应该能够定义“基本查询”(即具有所有导航属性的那个),然后根据需要进一步过滤并执行查询。过滤“基本查询”的结果稍有不同

某些代码可能有助于进一步解释,这就是我呼吁我的“基本查询”

private static IEnumerable<HelpdeskTicket> GetAll() 
{ 
    IEnumerable<HelpdeskTicket> Tickets; 

    using (ItManagement_Entities db = new ItManagement_Entities()) 
    { 
     Tickets = db.HelpdeskTickets.Include("CreatedByPerson") 
            .Include("HelpdeskCategory") 
            .Include("HelpdeskPriority") 
            .Include("HelpdeskStatus"); 
    } 

    return Tickets; 
} 

举个例子,一些我需要执行的查询是开放的门票,最近关闭的门票,我的门票,yada yada yada。

我的想法是有类似于以下的方法来做滤波比特而不需要h然后再次定义所有.Include()

public static List<HelpdeskTicketModel> GetAllTickets() 
{ 
    List<HelpdeskTicketModel> Tickets = new List<HelpdeskTicketModel>(); 

    GetAll().OrderByDescending(t => t.TicketId) 
      .ToList() 
      .ForEach(t => Tickets.Add(HelpdeskTicketModel.Map(t))); 

    return Tickets; 
} 

public static List<HelpdeskTicketModel> GetRecentlyClosedTickets() 
{ 
    List<HelpdeskTicketModel> Tickets = new List<HelpdeskTicketModel>(); 

    GetAll().Where(t => t.HelpdeskStatus.IsClosedStatus) 
      .OrderByDescending(t => t.ClosedTime) 
      .ToList() 
      .ForEach(t => Tickets.Add(HelpdeskTicketModel.Map(t))); 

    return Tickets; 
} 

//And so on... 

当我尝试这个,我得到一个System.InvalidOperationException抛出异常抱怨The operation cannot be completed because the DbContext has been disposed,这是有道理的,因为真我的查询是在不同的上下文,在GetAll方法。

问题是,我该如何去做我想做的事?

+0

您可以随时将您的dbcontext传递到您的GetAllTickets方法。 – grin0048

回答

0

您可以尝试类似于Template Method pattern的东西,其中每个特定的方法都会调用一些基本的私有方法来执行常见工作,然后每个方法都会添加其特定位的查询。像这样的东西可能会方便起点:

// Here you define common parts applicable to all methods, or at least shared among some of them 
private static IQueryable<HelpdeskTicket> BuildBaseQuery(this IQueryable<HelpdeskTicket> query) 
{ 
    return query.Include("CreatedByPerson") 
       .Include("HelpdeskCategory") 
       .Include("HelpdeskPriority") 
       .Include("HelpdeskStatus"); 
} 

// Here are the particular methods, they create a query, call helper methods for the common bits and add their specifics 
public static List<HelpdeskTicketModel> GetAllTickets() 
{ 
    List<HelpdeskTicketModel> Tickets = new List<HelpdeskTicketModel>(); 

    using (ItManagement_Entities db = new ItManagement_Entities()) 
    { 
     Tickets = db.HelpdeskTickets.BuildBaseQuery() 
            .OrderByDescending(t => t.TicketId) 
            .ToList() 
            .ForEach(t => Tickets.Add(HelpdeskTicketModel.Map(t))); 
    } 

    return Tickets; 
}