2012-05-30 16 views
15

私はLinq To SQLを使用する必要がある新しいプロジェクトに取り組んでいます。ストアドプロシージャを実行するために使用できる汎用または再利用可能なLinq to SQLクラスを作成するように求められました。再利用可能なLinqをストアドプロシージャのSQLに作成する

私はちょうど私が実行すると、私は私が実行する必要がクエリごとに異なる文字列を渡すことができ何を望むかの文字列を渡すことによってこれを行う方法を知っていた ADO.Net

SqlCommand cmd = new SqlCommand("myStoredProc", conn); // etc, etc 

私は苦労していますLinq To SQLのようなものを作成する方法もあります。私は.dbmlファイルを作成し、それに私のストアドプロシージャを追加しました。その結果、私は以下のコードを使用して結果を返すことができます。

public List<myResultsStoreProc> GetData(string connectName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.myResultsStoreProc(); 

    return query.ToList(); 
} 

コードは動作しますが、彼らは私が実行するためにそれを伝えるものは何でも、ストアドプロシージャを返します一つの方法を作成したいです。私はオンラインで検索し、これについて同僚に話し、再利用可能なストアドプロシージャクラスを作成する方法を見つけることに失敗しました。

ストアドプロシージャを実行するために再利用可能なLinq to SQLクラスを作成する方法はありますか?

編集:私は探しています何

次のような何かをする方法があるかどうかでしょうか?

public List<string> GetData(string connectName, string procedureName) 
{ 
    MyDataContext db = new MyDataContext (GetConnectionString(connectName)); 
    var query = db.procedureName(); 

    return query.ToList(); 
} 

私はLinq To SqlMSDN docsを見直しており、これらはIEnumerableでテーブルを示している。

IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
    @"select c1.custid as CustomerID, c2.custName as ContactName 
     from customer1 as c1, customer2 as c2 
     where c1.custid = c2.custid" 
); 

私は私が保存されたの文字列値で送ることができる非常に一般的な何か、を探しています私が実行したいproc。これが不可能な場合は、なぜこのようにすることができないのかに関する文書はありますか?私たちはLinq To Sql

+0

あなたが.dbmlファイルでモデル化されていない可能性がありますストアドプロシージャを実行する必要がありますか?そして、あなたは.dbmlにマップされているエンティティを返そうとしていますか? – CodingGorilla

+0

これらはほとんどの場合、.dbmlにマップされますが、そうでない場合があります。 – Taryn

+0

これはLINQ to SQLを使用する方法ではありません。あなたはシステムに対して働いています。それが使用されることを意図しているように作業してください。 – usr

答えて

16

DataContext.ExecuteCommandは、int値のみを返すため、探しているものではありません。 DataContext.ExecuteQueryは、ストアドプロシージャを実行してデータセットを返すことができます。

この関数を格納するDBMLの部分クラスを作成します。

public List<T> GetDataNoParams(string procname) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname); 

    return query.ToList(); 
} 

public List<T> GetDataParams(string procname, Object[] parameters) 
{ 
    var query = this.ExecuteQuery<T>("Exec " + procname, parameters); 

    return query.ToList(); 
} 

あなたはどうなるのストアドプロシージャを呼び出すために:あなたがいることを戻り値のない手続きを呼び出したい場合は

GetDataNoParams("myprocedurename"); 

または

GetDataParams("myotherprocedure {0}, {1}, {2}", DateTime.Now, "sometextValue", 12345); 

または

GetDataParams("myotherprocedure var1={0}, var2={1}, var3={2}", DateTime.Now, "sometextValue", 12345); 

を私は確信しているので、あまりにも簡単です新しいメソッドを作成することで、何も格納/返さないことがわかります。

インスピレーションはhttp://msdn.microsoft.com/en-us/library/bb361109(v=vs.90).aspxから届きました。

+0

DBMLファイルは 'ExecuteQuery 'メソッドに、 'T'はデータをオブジェクトインスタンスにマッシュアップできるようにするためのものですか? – bluevector

+0

いいえ、あなたがそれを何と呼んだのかを教えてください。私の例では、各ストアドプロシージャの戻り値の型にマップされたオブジェクトがすでに存在することを前提としています。したがって、顧客を返すストアドプロシージャがあり、顧客オブジェクトタイプを持っている場合は、T. – Peter

+0

Gotchaの顧客に渡します。だから私たちは 'IQueryable'にしようとしていません - もしprocを保存していて、何も全知にする必要はありません。 – bluevector

2

に実行するプロシージャの名前の文字列値を渡すことはできませんなぜあなたの質問への最も簡単な答えは、あなたのMyDataContextConnection財産を取得し、作成し、独自SqlCommand Sを実行できることであることを証明する必要がありますあなたがまっすぐなADO.Netのように。私はそれがあなたの目的に役立つかどうかはわかりません。特に、LINQからSQLモデルにエンティティを取得したい場合にはそうです。

エンティティをモデルから戻したい場合は、DataContext.ExecuteCommandメソッドを見てください。

+0

この方向性をありがとうが、私は実行したいプロシージャの名前で文字列を渡す方法に関する追加情報を提供することができます。 – Taryn

+0

@bluefeetピーターの答えを参照してください、彼はまともな例をいくつか持っています。 – CodingGorilla

0

.dbmlファイルにTableまたはStoredProcedureをドロップすると、データレイヤーとビジネスロジックと通信するクラスが作成されます。

Linq to SQLには、.dbmlファイルにStoredProceduresまたはTablesが存在する必要があります。そうしないと、名前をメソッドに渡してストアドプロシージャを呼び出すためのLinqの汎用メソッドをSQLに呼び出すことはできません。

しかし、(あなたが知っているように)ADO.Netに、我々はそれを行うことができます

SqlCommand cmd = new SqlCommand("myStoredProc", conn); 
関連する問題