Как мне вернуть IQueryable из Linq в запрос SQL, когда dbContext с блоком 'using'? - PullRequest
10 голосов
/ 15 сентября 2010

Я кодирую с использованием блоков '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;
    }
}

Просто удалитьблок «using» и пусть .Net управляет объектами, или я могу заставить Linq выполнить запрос раньше и вернуть заполненный объект.

Ответы [ 4 ]

7 голосов
/ 15 сентября 2010

Если вы не ожидаете дальнейшего составления данных (на db-сервере), тогда:

return contacts.ToList().AsQueryable();

хотя в этом случае я бы предпочел вернуть IEnumerable<Contact> или IList<Contact>, чтобы сделать несмешиваемую природу очевидной. При подходе AsQueryable он все равно будет композируемым , но будет компоноваться через LINQ-to-Objects (поэтому после он выберет записи из базы данных).

Если вы делаете ожидаете дальнейшего его составления, тогда вы должны передать контекст данных (или, если возможно, вышестоящий 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 голосов
/ 15 сентября 2010

Экземпляр объекта контакта в наборе результатов IQueryable сохранит ссылку на текстовый текст данных, используемый в блоке using, и будет работать в клиентском коде так, как ожидалось.Вы сможете выполнять отложенные операции SQL с результирующим экземпляром IQueryable и выполнять другие операции IQueryable как обычно.

0 голосов
/ 15 сентября 2010

Можете ли вы сделать объект контекста экземпляром вашего класса?Если вы можете, вы отложите вызов, чтобы выполнить запрос, пока не коснетесь перечислитель, лежащий в основе возвращаемого вами экземпляра IQueryable.Это зависит от того, что вы хотите сделать.Вам нужно вернуть IQueryable из этого метода, или вы можете обойтись с IEnumerable?

0 голосов
/ 15 сентября 2010

вы могли бы сделать что-то вроде этого

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...