C# 当dbContext带有“using”块时,如何从Linq返回IQueryable到SQL查询?

C# 当dbContext带有“using”块时,如何从Linq返回IQueryable到SQL查询?,c#,.net,linq-to-sql,C#,.net,Linq To Sql,我一直在使用“using”块进行编码,但我想知道是否可以从下面返回一个IQueryable,而不必在访问它之前处理该对象 public IQueryable<Contact> GetContacts(string clientID) { using (dbDataContext db = new dbDataContext()) { var contacts = from _contacts in db.Contacts

我一直在使用“using”块进行编码,但我想知道是否可以从下面返回一个IQueryable,而不必在访问它之前处理该对象

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

我是简单地删除“使用”块并让.Net管理对象,还是让Linq尽早运行查询并返回填充的对象。

如果您不希望在db服务器上进一步合成数据,那么:

return contacts.ToList().AsQueryable();
尽管在这种情况下,我更愿意返回IEnumerable或IList,以使不可组合性变得明显。使用AsQueryable方法,它仍然是可组合的,但它将通过LINQ组合到对象,因此在它从数据库中获取记录之后

如果确实希望进一步组合它,则应将数据上下文或(如果可能)上游IQueryable传递到方法中,并让调用方处理生存期:

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

你可以这样做

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

能否将上下文对象作为类的成员实例?如果可以的话,您将推迟运行查询的调用,直到您实际接触正在返回的IQueryable实例下面的枚举数为止。这取决于你想做什么。是否需要从此方法返回IQueryable,或者是否可以使用IEnumerable?

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

这不会有帮助-延迟执行LINQ查询意味着在对基础查询调用GetEnumerator之前很久,db上下文仍被释放。所以没有工作对象。请注意,实际上没有必要显式地处理datacontext。不管怎样,这个问题问得好。@Fearofahackplanet-er,是的。在我看来,任何一次性物品都应该被认为需要处理,并且应该得到适当的处理。它可以保持一个开放的连接,例如…@Marc:我只是继续我在几个博客上读到的内容,以及ScottGu和Linq团队的几乎所有例子。据我所知,微软的官方立场是,如果它能让你感觉更好,你可以处理它,但这真的不是必要的。有关dispose和本问题中描述的延迟执行问题的一些讨论,请参见示例。Scott Guthrie:Datacontext对象实际上没有打开到数据库的任何连接,因此您不必明确地对其进行dispose。相反,它只在需要时从连接池中检索新连接,然后在完成后立即返回。你不可能在任何更高的权威上获得它。对于任何人来说,这里有一个更新的链接,文章是@FearofahackPlanet posted:当我尝试时,我会得到“在Dispose之后访问DataContext”。@IckleMonkey-这是最重要的具体类型,但IList的一个明显优势是它将公开.Count等和一个索引器,使访问更方便。但不管IList和IEnumerable如何,它仍然是一个列表,因此内存使用是独立的。或者更简洁的回答是:使用IListI我想我会使用IEnumerable,如果我使用成员实例方法,那么如果我的类被用作“using”块,并且我希望访问此块之外的返回数据,我可能会遇到同样的问题。谢谢你的建议。