2016-09-28 3 views
0

のタイプを選択すると、フォームで選択されたフィールドに応じて4つのストアドプロシージャが使用されます。私のプログラムでforeachループ

ように
ctx = new DataClassesDataContext(); 
items = (from prjs in ctx.sp_Select_Stuknummers(prjnr) select prjs).ToList(); 

または

ctx = new DataClassesDataContext(); 
items = (from prjs in ctx.sp_Select_Stuknummers_Scanner(prjnr, scanner) select prjs).ToList(); 

と...

私はSQLにLINQを使用して、これら4つのクエリごとに、私は別の結果クラスを持っている:

sp_Select_StuknummersResult 
sp_Select_Stuknummers_ScannerResult 
sp_Select_Stuknummers_Scanner_WPSResult 
sp_Select_Stuknummers_StuknummerResult 

これらはすべて同じフィールドと定義を持ちます。今

、私は結果繰り返すとき:

foreach (sp_Select_StuknummersResult x in items) 
     { 
      WPSitems ding = new WPSitems(); 
      ding.ID = x.ID; 
      ding.Naam = x.Naam; 
     ...... 

     } 

を私は(この例では:sp_Select_StuknummersResult)を使用するタイプを渡す必要があり

A.どちらかを簡単に変換する方法はあります新しいタイプは、毎回使用できるようにする または B.動的にforeachループでタイプを設定しますか?

多分、私が気づいていないCもあります... 何か助けをいただきありがとうございます!

+1

私はあなたが求めている正確に何か分からないけどん 'foreachの(items.OfType中のvar X ())'何をしたいですか?そうでない場合は、別の方法で説明しようとしていますか? – Enigmativity

+0

これがどのように役立つかは本当にわかりません。あなたの発言では、私はまだに入れなければなりません。それは私が動的にしたい部分です。 – JamesBB

+2

次に、共通の基本クラスを持つことを検討するか、または各クラスが共通のインターフェースを実装するようにする必要があります。 – Enigmativity

答えて

1

、L2Sの各個々のストアドプロシージャのための別個のタイプを自動生成します。ただし、Linq-2-Sql Designerでその戻り値の型を簡単に変更できます。

デザイナーで、ストアドプロシージャをクリックします。 [プロパティ]ウィンドウには、「戻り値の型」という項目があります。「自動生成型」から必要な型に変更します。

ストアドプロシージャが既にマップされたテーブルから行を返す場合は、ドロップダウンでその型を選択します。そうでない場合は、デザイナにクラスを手動で追加し、その型をストアドプロシージャから返すように設定できます。

example

+0

これは私が必要としていたものです。平易でシンプル。貢献したすべての人に感謝しますが、これは私のニーズに最も適しています。 – JamesBB

0

私が正しくあなたの問題を理解していれば、これはあなたを助けるかもしれない:

1)は、結果のクラスのためのインターフェース(例えば)I_SPを作成します。

sp_Select_StuknummersResult 
sp_Select_Stuknummers_ScannerResult 
sp_Select_Stuknummers_Scanner_WPSResult 
sp_Select_Stuknummers_StuknummerResult 
  • 共通変数やメソッドを追加することあなたはそのインターフェイスに必要です。

2)あなたのitemsList<I_SP>

3であることを確認してください)

public void MyMethod<T>(List<I_SP> items) where T:I_SP { 
    foreach (var x in items.OfType<T>) 
    { 
    WPSitems ding = new WPSitems(); 
    ding.ID = x.ID; 
    ding.Naam = x.Naam; 
    ...... 
    } 
} 

4. foreachループのための汎用的なメソッドを作成します)それからちょうどこのように、これを呼び出す:

MyMethod<*sp_Select_StuknummersResult result class*>(items); 

希望があれば十分です。

+0

このアプローチでは、部分的なクラスを追加する必要があります(異なるsp_Select_Stuknummers *クラスが共通のインターフェースを実装するようにする).OPは、すべてのストアドプロシージャのタイプを統一する機能を持つLinq 2 SQLを使用しています。 – jeroenh

0

ジェネリック/リフレクションを使用してこれを行うことができます。

public static WPSitems MapObjectWithIdenticalProperties<T>(T itemOfUnknownType) where T : new() 
    { 
     var inputType = typeof(T); 

     var outputType = typeof(WPSitems); 

      var outputItem = new WPSitems(); 
      foreach (var inputProperty in inputType.GetProperties()) 
      { 
       var matchingOutputProperty = outputType.GetProperties().FirstOrDefault(x => x.Name == inputProperty.Name); 
       if(matchingOutputProperty != null) 
        matchingOutputProperty.SetValue(outputItem, inputProperty.GetValue(itemOfUnknownType)); 
      } 
     return outputItem; 
    } 

上記の関数は次のように呼び出すことができる。デフォルトで

var items = GetYourDataThatCanBeDifferentTypes(); 
var mappedItems = new List<WPSitems>(); 

foreach(var item in items) 
    mappedItems.add(MapObjectWithIdenticalProperties(item)); 
+0

これはしないでください。実際にはうまくいきますが、実際には過剰な作業で、パフォーマンス上の問題が生じるかもしれません。少なくとも、読んで理解しにくいコードを導入します。 – jeroenh