2016-05-04 8 views
1

私はLinq to Sqlを使用しています。私は(System.Linq)toList()メソッドを呼び出すときにトランザクションスコープを開きたいと思います。したがって、カスタム拡張クラスを作成してtoList()の新しいバージョンを作成することによって、デフォルトのtoList()メソッドをオーバーライドしようとしていました。しかし、カスタムのtoList()拡張の中で、私は既存のデフォルト(system.linq)ToList()メソッドを呼びたいと思います。しかし私はそれをすることができません。以下の例を参照してください。Linq既存のtoList()メソッドをオーバーライドする方法

コード:上記のコードで

public static int GetRecordsWithNoChangeToQuery() 
{ 
    string connection = ConfigurationManager.ConnectionStrings["EventConn"].ConnectionString; 
    using (var ctx = new EventsDataContext(connection)) 
    { 
     var records = (from m in ctx.Event select m).ToList(); //calling custom extension method 
     return records.Count(); 
    } 
} 

LinqExtenionHeler

public static class LinqExtension 
{ 
    public static TransactionScope CreateLockTransaction() 
    { 
     var options = new TransactionOptions 
     { 
      IsolationLevel = IsolationLevel.ReadCommitted 
     }; 
     return new TransactionScope(TransactionScopeOption.Required, options); 
    } 

    //custom extension method 
    public static List<T> ToList<T>(this IEnumerable<T> query) 
    { 
     using (TransactionScope ts = CreateLockTransaction()) 
     { 
      return query.ToList(); //fails, not able to call system.linq .toList method 
     } 
    } 
} 

私はquery.ToList(呼び出したとき)、エラーをitsthrows。として、それは自分自身を呼び出すしようとしている。どのように同じ名前カスタム拡張メソッドからデフォルト(syste.linq)query.toList()を呼び出すには?

+5

AS-synataxこのメソッドに別の名前を付ける必要があります。そうしないと、価値が追加されるよりも混乱が生じます。 – Servy

+3

'System.Linq.Enumerable.ToList(クエリ)'(でもServyが言ったこと) –

+0

Dennisに感謝します。それは動作します –

答えて

2

拡張メソッドは、パブリックな静的メソッドを呼び出すための単なる方法です。あなたはそれを普通の方法と呼ぶことができ、時にはそれをする必要があります。

return System.Linq.Enumerable.ToList(query); 

しかし、私は「待って、なぜあなたはこれをしていますか?」というコメントをサポートしています。これは、これについて行くために次善の方法のように思えます。おそらく、あなたの問題に関するよりオープンな質問をして、あなたのグローバルな問題に対するより良い答えを得るべきでしょう。これはあなたのローカルな構文上の問題を修正するだけです。

+0

実際には、レガシークラスにトランザクションサポートを追加したいと思います。だから、私は毎回 "linq to sql"クエリを変更したくないので、なぜtoList()の新しいバージョンを作成しているのですか。大規模なコード変更なしでより良い解決策をご存知でしたら教えてください。 –

-1

Listに対して作成する拡張メソッドは、クエリの種類がIEnumerableであり、これは例外またはデッドロック状態になる可能性があるため、内部的に呼び出されます。 ToList Extensionメソッドでは、渡すパラメータをIQueryableにすることができます。 だから、あなたがこれを行うことができますが、あなたはいけない。

public static List<T> ToList<T>(this IQueryable<T> query)
{ using (TransactionScope ts = CreateNoLockTransaction()) { return query.AsEnumerable().ToList(); } }

関連する問題