3

ストアド プロシージャを実行するときに、LINQ To SQL DataContext から出力パラメーターを取得することは可能ですか?

IEnumerable<Address> result = 
    ExecuteQuery<Address>(((MethodInfo)(MethodInfo.GetCurrentMethod())), 
       address, pageIndex, pageSize, totalCount);

ここでaddresspageIndexおよびpageSizeは入力パラメーターであり、TotalCountは出力パラメーターです。

どのように出力パラメータをキャプチャできますか?

これは別の試みですが、パラメータ値を取得できません。


    [Function(Name = "Telecom.AddressSearch")]
        private IEnumerable SearchAddress([Parameter(Name = "address", DbType = "varchar")] string address,
                                             [Parameter(Name = "pageIndex", DbType = "int")] int pageIndex,
                                             [Parameter(Name = "pageSize", DbType = "int")] int pageSize,
                                             [Parameter(Name = "totalCount", DbType = "int")] ref int totalCount)
        {            
            IEnumerable result = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount);

            return result;
        }
4

1 に答える 1

6

Scott Guthrie は、LINQ to SQL をストアド プロシージャと連携させる方法を説明するブログ投稿を行っています。彼の投稿はあなたの質問に直接答えるものではありませんが、うまくいくかもしれない何かの手がかりを提供します. .dbml クラスでメソッドを定義する場合、「LINQ to SQL は SPROC の 'out' パラメーターを参照パラメーター (ref キーワード) としてマップします。」ref キーワードを試してみて、totalCount が更新されるかどうかを確認してください。

   IEnumerable r = ExecuteQuery(((MethodInfo)(MethodInfo.GetCurrentMethod())),
   address, pageIndex, pageSize, ref totalCount);

アップデート:

私はさらに調査を行い、あなたに合った方法を見つけました。これはMSDN の記事からのものです。DataContext を拡張する必要がありますが、それはそれほど大きな問題ではありません (すでにこれを行っている可能性があります)。詳細については記事を参照してください。ただし、基本的な部分は次のとおりです。

[Function(Name="dbo.CustOrderTotal")]
[return: Parameter(DbType="Int")]
public int CustOrderTotal([Parameter(Name="CustomerID", DbType="NChar(5)")] string customerID, [Parameter(Name="TotalSales", DbType="Money")] ref System.Nullable<decimal> totalSales)
{
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), customerID, totalSales);
    totalSales = ((System.Nullable<decimal>)(result.GetParameterValue(1)));
    return ((int)(result.ReturnValue));
}

「これ」は DataContext です。

更新 2:

IExecuteResult にはReturnValueプロパティがあります。これは Object 型であるため、結果を取得するにはキャストする必要がありますが、結果の Enumerable を取得できるはずです。あなたの場合、次のようなものが機能するはずです:

IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), address, pageIndex, pageSize, totalCount);
totalCount = ((System.Nullable<decimal>)(result.GetParameterValue(3)));
return (IEnumerable<Address>)result.ReturnValue;
于 2010-08-18T14:10:38.457 に答える