У меня есть следующий метод:
public IEnumerable<Foo> GetFoo(int x, string y)
{
return from r in new GetFoo(x, y)
select new Foo
{
x = r.Get<int>("x"),
y = r.Get<string>("y"),
z = r.Get<DateTime?>("z"),
};
}
GetFoo
- это класс, который содержит хранимую процедуру и реализует IEnumerable<DbDataReader>
.Итак, r
- это DbDataReader
.Я хочу, чтобы он выполнил запрос, в котором объявлен синтаксис запроса, и вернул List<Foo>
.
. Если этого не сделать, то, насколько я понимаю, вызывающая сторона может просто не выполнять итерацию всего списка, а затем соединение с базой данных не будетбыть закрытымЯ знаю, что могу просто поставить его в скобки и вызвать ToList (), но я хочу избежать этого, если это возможно.У нас более 200 хранимых процедур, и разработчику слишком легко пропустить добавление ToList ().
Есть ли что-то, что я могу реализовать, чтобы добиться желаемого?
Обновление
Это не linq to sql, я создал кастомкласс GetFoo
, который реализует IEnumerable<DbDataReader>
.Возвращаемое IEnumerator<DbDataReader>
выглядит следующим образом:
private class Enumerator : IEnumerator<DbDataReader> {
DbDataReader _;
public Enumerator(DbDataReader r) { _ = r; }
public DbDataReader Current { get { return _; } }
public void Dispose() { _.Dispose(); }
object System.Collections.IEnumerator.Current { get { return _; } }
public bool MoveNext() { return _.Read(); }
public void Reset() { throw new NotImplementedException(); }
}
Обновление 2
Я не могу принудительно вызвать ToList()
и / или требовать List<Foo>
быть возвращаемым типом этого метода и тому подобное.Отзыв разработчика должен поймать, не преобразовав его в список.К сожалению, если его пропустили там и в тестировании QA, приложение будет работать нормально.Я просто пытаюсь предотвратить ситуацию, когда соединение с базой данных можно оставить открытым.