「暫定」というコメントがついたソースは、そのまま放置される事が多い(´・ω・`)

暫定。

public static IEnumerable<T> WithUpdlock<T>(this DataContext context, IQueryable query)
{
    DbCommand cmd = context.GetCommand( query.AsQueryable() );

    // 暫定
    Regex regex = new Regex( "FROM \\S+ AS \\[t0\\]" );
    string cmdText = regex.Replace( cmd.CommandText, "$& WITH ( UPDLOCK )" );

    object[] parameters = cmd.Parameters.Cast<IDbDataParameter>().Select( p => p.Value ).ToArray();

    return context.ExecuteQuery<T>( cmdText, parameters );
}

使用。

TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.Serializable;
using( TransactionScope sc = new TransactionScope( TransactionScopeOption.Required, options ) )
using( TestDataContext context = new TestDataContext() )
{
    IQueryable query = context.Employee.Where( employee => employee.No == 4054 );

    Employee employee = context.WithUpdlock<Employee>( query ).SingleOrDefault();

    // Insert or Update
... 
}

参考


こんなことの一方で、Visual Studio 2005な環境用に単純なORMを作っていたり。
っというか、これも昔作ったものの再利用(っといっても再設計はしています)だけど。
とりあえず最下位レイヤのExecutorは用意した。
明日はEntityからのメタデータ作成処理と、SqlBuilderのあたりを出来るところまで作って、17日はお休みな方向で(・ω・)
来週はじめに完成すればいいや( ゚Д゚)