Gro*_*roo 7 c# transactions idisposable yield-return try-catch-finally
正如Eric Lippert在本文中所描述的那样,yield return不允许在try/catch条款内.
有没有一种很好的方式我可以得到这样的东西,而不必IEnumerator手工编写我自己的东西:
public IEnumerable<Data> 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();
}
}
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 11
我只是改变这样的事务处理逻辑:
public IEnumerable<Data> 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();
}
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您的事务支持"dispose意味着回滚,除非它被提交"的想法:
public IEnumerable<Data> 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();
}
}
Run Code Online (Sandbox Code Playgroud)