Не так давно ExecuteEnumerable<T>, возвращающий IEnumerable<T>, был добавлен в DataAccessor, хорошо бы иметь такой метод и в DbManager'е. Иногда бывает полезно "вытащить" лишь небольшую часть результатов запроса, а существующие методы семейства Exec... этого сделать не позволяют.
Здравствуйте, drassokhin, Вы писали:
D>Не так давно ExecuteEnumerable<T>, возвращающий IEnumerable<T>, был добавлен в DataAccessor, хорошо бы иметь такой метод и в DbManager'е. Иногда бывает полезно "вытащить" лишь небольшую часть результатов запроса, а существующие методы семейства Exec... этого сделать не позволяют.
Эммм... а чем Вам ExecuteList<T>() не IEnumerable<T> ? "Вытащить лишь небольшую часть результатов запроса", оперируя в LINQ To Objects это вполне позволяет.
Здравствуйте, eLVik, Вы писали:
LV>Эммм... а чем Вам ExecuteList<T>() не IEnumerable<T> ? "Вытащить лишь небольшую часть результатов запроса", оперируя в LINQ To Objects это вполне позволяет.
А если не хочется вытягивать все записи на клиента, а критерий остановки нетривиален?
Здравствуйте, Andy77, Вы писали:
LV>>Эммм... а чем Вам ExecuteList<T>() не IEnumerable<T> ? "Вытащить лишь небольшую часть результатов запроса", оперируя в LINQ To Objects это вполне позволяет. A>А если не хочется вытягивать все записи на клиента, а критерий остановки нетривиален?
ExecuteReader + MapToObject?
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, Andy77, Вы писали:
IT>>ExecuteReader + MapToObject? A>Да. Я просто думал, что ExecuteEnumerable именно это и делает, видимо, я ошибаюсь, и разговор идет про что-то совсем другое
С ExecuteEnumerable всё немного сложнее, т.к. внутри он контролирует время жизни DBManager. Поэтому результат вызова можно безопасно передавать куда угодно. В случае с DbManager, область применения такого метода будет ограничена временем жизни DbManager, что приведёт к неочевидностям.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, IT, Вы писали:
IT>Здравствуйте, Andy77, Вы писали:
IT>>>ExecuteReader + MapToObject? A>>Да. Я просто думал, что ExecuteEnumerable именно это и делает, видимо, я ошибаюсь, и разговор идет про что-то совсем другое
IT>С ExecuteEnumerable всё немного сложнее, т.к. внутри он контролирует время жизни DBManager. Поэтому результат вызова можно безопасно передавать куда угодно. В случае с DbManager, область применения такого метода будет ограничена временем жизни DbManager, что приведёт к неочевидностям.
Так можно и полученный в результате LINQ-запроса (from x in db.GetTable<T>() where... select x) объект типа Table<T> куда-нибудь передать, потом вызвать Dispose (через using или явно) для родительского DbManager'а, а после этого попытаться использовать полученный Table<T>, тоже ведь плохо будет...
Потом, у DataAccessor.ExecuteEnumerable есть аргумент bool disposeDbManager, почему бы для DbManager.ExecuteEnumerable такой аргумент не использовать? Было бы что-то типа var myLovelyEnumerable = (new DbManager("My Connection")).SetCommand(...).ExecuteEnumerable<MyType>(..., true);