17

を使用する必要がある新しいプロジェクトに取り組んでいますLinq To SQLLinq to 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();
}

コードは機能しますが、実行するように指示したストアド プロシージャを返すメソッドを 1 つ作成するよう求められています。私はオンラインで検索し、これについて同僚と話しましたが、再利用可能なストアド プロシージャ クラスを作成する方法を見つけることができませんでした。

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

編集:

私が探しているのは、次のようなことを行う方法があるかどうかです。

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

   return query.ToList();
}

MSDN のドキュメントを確認したところLinq To Sql、次の表が表示されています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"
);

実行したいストアドプロシージャの文字列値を送信できる、非常に一般的なものを探しています。これが不可能な場合、なぜこのようにできないのかについての文書はありますか? 実行するプロシージャの名前の文字列値を渡せない理由を証明する必要がありますLinq To Sql

4

3 に答える 3

18

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から得ました。

于 2012-06-05T17:10:07.783 に答える
2

あなたの質問に対する最も簡単な答えは、ADO.Net の場合と同じように、自分のConnectionプロパティを取得し、独自のMyDataContextを作成して実行できるということです。SqlCommand特にLINQ to SQLモデルからエンティティを取得したい場合は、それがあなたの目的に役立つかどうかはわかりません。

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

于 2012-05-30T19:29:31.167 に答える
0

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

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

しかし、ADO.Net ではそれが可能です (ご存じのとおり)。

SqlCommand cmd = new SqlCommand("myStoredProc", conn);
于 2012-06-07T12:22:22.073 に答える