从try / catch块返回的产量

正如Eric Lippert在本文中所描述的那样, try/catch子句中不允许yield return

有没有一种很好的方法可以得到这样的东西,而不必亲自编写我自己的IEnumerator

 public IEnumerable GetData() { var transaction = Session.BeginTransaction()); try { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) yield return ProjectResult(result); // <-- doesn't work session.Commit(); } catch (Exception ex) { transaction.Rollback(); throw; } finally { transaction.Dispose(); } } 

我只是改变这样的事务处理逻辑:

 public IEnumerable GetData() { var transaction = Session.BeginTransaction(); bool rollback = true; try { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) { yield return ProjectResult(result); } rollback = false; session.Commit(); } finally { if (rollback) { transaction.Rollback(); } transaction.Dispose(); } } 

或者,如果您的事务支持“dispose意味着回滚,除非它已被提交”的想法:

 public IEnumerable GetData() { using (var transaction = Session.BeginTransaction(); { IQuery q = CreateQuery(session); foreach (var result in q.Enumerable()) { yield return ProjectResult(result); } // Commits the tnrasaction, so disposing it won't roll it back. session.Commit(); } } 

重因素

 foreach (var result in q.Enumerable()) yield return ProjectResult(result); 

进入一个单独的方法,只需返回它的结果。