2010-09-15 36 views
8

我一直在编写'使用'块,但我想知道如果我可以返回一个IQueryable从以下没有对象被处置之前我访问它。当dbContext带有'using'块时,如何从Linq返回一个IQueryable到SQL查询?

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    using (dbDataContext db = new dbDataContext()) 
    { 
     var contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 

     return contacts; 
    } 
} 

难道我简单地去掉“使用”块,让净管理的对象,或者我可以得到LINQ到早期运行查询并返回填充对象。

+0

请注意,显式处理datacontext并不是必须的。无论如何,这是个好问题。 – fearofawhackplanet 2010-09-15 10:59:44

+0

@fearofawhackplanet - 呃,是的。任何一次性物品都应被假定为**要求**处置,并且应该适当处理IMO。它可以保持一个开放的连接,例如... – 2010-09-15 11:12:31

+0

@Marc:我只是继续我在几个博客上阅读的内容,还有几乎所有ScottGu和Linq团队的例子。据我所知,官方微软的立场是,如果它让你感觉更好,你可以处置,但它确实不是必需的。请参阅http://leedumond.com/blog/about-disposing-the-datacontext/,以此作为关于此问题中描述的处置和防御执行问题的一些讨论的示例。 – fearofawhackplanet 2010-09-15 11:38:09

回答

6

如果您不希望进一步构成数据(在DB服务器),然后:

return contacts.ToList().AsQueryable(); 

虽然在这种情况下,我宁愿回到IEnumerable<Contact>IList<Contact>使非组合性很明显。使用AsQueryable的方法,它仍然是可组合的,但它将通过LINQ到对象组成(所以之后它已经从数据库获取记录)。

如果期望进一步构成它,那么就应该通过数据上下文(或者,如果可能的话,上游IQueryable<something>的方法中,并让主叫处理寿命:

public IQueryable<Contact> GetContacts(dbDataContext db, string clientID) 
{ 
    return from _contacts in db.Contacts 
      where _contacts.ClientID == clientID 
      orderby _contacts.LastName ascending 
      select _contacts; 
} 
+0

@IckleMonkey - 这是最重要的*具体*类型,但是'IList '的一个明显的优势是它会暴露'.Count'等(和一个索引器),使访问更加方便。但无论“IList ”与“IEnumerable ”是否相同,它仍然是*列表,因此内存使用是独立的。或者为了更简洁的回答:使用'IList ' – 2010-09-15 11:20:03

-1

你可以做这样的事情

public IQueryable<Contact> GetContacts(string clientID) 
{ 
    IQueryable contacts; 
    using (dbDataContext db = new dbDataContext()) 
    { 
     contacts = from _contacts in db.Contacts 
         where _contacts.ClientID == clientID 
         orderby _contacts.LastName ascending 
         select _contacts; 


    } 

    return contacts; 
} 
+2

这不会有帮助 - 延迟执行LINQ查询意味着db-context在底层查询上调用GetEnumerator()之前仍然很久以前。所以没有工人。 – 2010-09-15 10:57:59

0

可以使上下文对象类的成员实例?如果可以的话,您将推迟调用以运行查询,直到您实际触及您要返回的IQueryable实例的枚举器。这取决于你想要做什么。你需要从这个方法返回IQueryable,还是你可以做IEnumerable?

+0

我想我会去IEnumerable,如果我使用成员实例方法,那么如果我的类用作'使用'块,我可能会遇到同样的问题,并且我想访问此外返回的数据。感谢您的建议。 – polom1nt 2010-09-15 11:22:29

0

IQueryable结果集中的联系对象实例将保留在using块中使用的datacontext的引用,并且将在预期的客户端代码中工作。您将能够对生成的IQueryable实例执行延迟SQL操作,并通常执行其他IQueryable操作。

+1

当我尝试时,我得到'Dispose后访问的DataContext'。 – polom1nt 2010-09-15 11:16:59