2009-07-29 8 views
0

I'm following Steve Sanderson's example from this ASP.NET MVC bookダイアグラムツールを使用してモデルを作成するのではなく、手作業でモデルを作成します。だから私のモデルの名前空間で、私はそれのこの部分は、すべての罰金ですそれIMultipleResultsカスタムモデルとリポジトリを使用する

[Table(Name="tblCC_Business")] 
public class Business 
{ 
    [Column(IsPrimaryKey=true, IsDbGenerated=false)] 
    public string BusinessID { get; set; } 

    // this is done because Business column and Business have interfering names 
    [Column(Name="Business")] public string BusinessCol { get; set; } 
} 

で、次のようなものでMySystemModelというクラスを配置します。しかし、問題はストアド・プロシージャから複数の結果セットを戻すことですが、SQLをLINQモデリングと混合して照合します。これは、LINQ to SQLの変換がクエリの一部では遅すぎるためです(実際にこの点について主張する点はありません。ビジネス要件です)。だから、基本的に私はそうのように、私の「リポジトリ」で私のLINQモデルと一緒に実際のSQLステートメントを使用します。

public IEnumerable<MyType> ListData(int? arg) 
{ 
    string query = "SELECT * FROM MyTable WHERE argument = {0}"; 

    return _dc.ExecuteQuery<MyType>(query, arg); 
    //c.GetTable<MyType>(); <-- this is another way of getting all data out quickly 
} 

今私がいる問題は、私はDataContextのを延長していないよと同様に、複数の結果セットを返す方法ですso:

public ContractsControlRepository() 
{ 
    _dc = new DataContext(ConfigurationManager.ConnectionStrings["MyConnectionString"].ToString()); 
} 

This linkは、ストアドプロシージャから複数の結果セットが返される方法を示します。

[Function(Name="dbo.VariableResultShapes")] 
[ResultType(typeof(VariableResultShapesResult1))] 
[ResultType(typeof(VariableResultShapesResult2))] 
public IMultipleResults VariableResultShapes([Parameter(DbType="Int")] System.Nullable<int> shape) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), shape); 
    return ((IMultipleResults)(result.ReturnValue)); 
} 

これを私のリポジトリで使用できるものにするにはどうすればよいですか?私は、DataContextを含むリポジトリから複数の結果セットを返すことができるだけで、それを拡張する必要はありません。以前の抽出結果をコピーしてリポジトリに貼り付けた場合、ExecuteMethodCallは利用できませんが、DataContextの場合にのみ利用可能です。

リソース

Guy Berstein's Blog

答えて

0

私は数分以内に答えを見つけることに終わる最後の日のために私を妨げてきた質問をするたびに。とにかく、この問題への答えはあなたのリポジトリにDataContextを拡張する必要があるということです。あなたは、あなたがこのような何かにリポジトリクラスのコンストラクタを変更することができ、すべて単一のコントローラに接続文字列を指定する必要が心配している私のような場合:

public ContractsControlRepository() 
     : base(ConfigurationManager.ConnectionStrings["AccountsConnectionString"].ToString()) { } 

この方法で、あなたのリポジトリをインスタンス化するときの接続がありますあなたのために設定しておくことで、心配する必要がなくなり、実際に接続文字列を指定して集中管理します。 DataContextを拡張すると、ストアドプロシージャの呼び出しや複数の結果セットを返すために使用されるExecuteMethodCallなどの保護されたメソッドにアクセスできることも意味します。

関連する問題