2009-03-04 16 views
2

c#とLINQが、必ずしもテーブル構造を返さず、結果セットを返すデータ構造体を処理する一般的な問題を解決する方法を決定する際に問題があります。LINQで結果セットの戻り値型を作成する方法

私が働くストアドプロシージャを持っている、と私のDBML

[Function(Name="dbo.p_GetObject")] 
public int p_GetObject([Parameter(Name="ObjectType", DbType="NVarChar(200)")] string objectType, [Parameter(Name="ItemState", DbType="Bit")] System.Nullable<bool> itemState, [Parameter(Name="IsPublished", DbType="Bit")] System.Nullable<bool> isPublished) 
{ 
    IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), objectType, itemState, isPublished); 
    return ((int)(result.ReturnValue)); 
} 

DBMLは、戻り値の型がある(なし)と、これが核心の問題である可能性がありと言うには、それが含まれています。しかし、私は結果セットと一致するDBMLオブジェクトを持っていません。

SPは3つのパラメータを取り、複数の行を持つ3つの列(ID、名前、値)を持つ結果セットを返します。私はこのためにデータオブジェクトを作成し、それが

私はこのために関数呼び出しを書くとき、私は立ち往生したResultSet呼び出すことができます。

public List<resultset> GetObject(string objectType, bool itemState, bool isPublished) 
{ 
    MyDataContext.p_GetObject(objectType, itemState, isPublished); 
} 

私の質問は以下のとおりです。私は持っていますか

ストアドプロシージャへのデータコンテキストコールは、私のresultSetオブジェクトに値を設定しますか?より良いアプローチがありますか?戻り値の型は何ですか? SQLビュー?良い提案を探しています...

答えて

6

あなたのSPを理解できない場合は、SET FMT_ONLYの問題かもしれません... SPの簡略版からデータを生成してみてください。

通常、既存のエンティティと1:1をマッピングしないSP/UDFは、生成されたタイプで公開されます。 DBMLファイル(デザイナーではない)で名前を変更することはできますが、個人的にはそうしません。私はプライベートとしてSPをマークする傾向があり、(リポジトリに対して定義された)私自身のPOCO型に突き出私自身の方法を記述します。

var typed = from row in cxt.SomeFunction(123) 
      select new MyType {Id = row.Id, Name = row.Name, ...} 

この理由は、リポジトリ純度のために、部分的であり、一部を防ぐために予期しない方法でDBMLを書き直すというデザイナーの習慣;-p詳細はhereを参照してください。

+0

SPはアプリから呼び出されて正常に動作しますが、結果をPOCOに戻すための最良の方法はわかりません。あなたが言及したように、生成された型を調べます。上記の方法で具体的なヒントがあれば助かります。ありがとうMarc。 –

+0

WSDLで型の名前を変更するか、独自の型を作成して上記のように "select"を使うかわかりません...あいまいな領域を明確にすれば、詳細を追加できます。 –

+0

マーク、問題を理解しました。私のストアドプロシージャは動的SQLを使用していました。ここでSQLは入力パラメータに基づいて形成され、次にSQL文字列が実行されます。そのようなprocは、DBMLデザイナーの型を自動生成しないので、私が自分のISingleResult を書く必要がありました。 –

関連する問題