2016-06-20 14 views
-1

2つのテーブルTableATableBの間にPK-FKの関係があり、これらの2つのテーブルをextension methodjoinと書いてデータをフェッチしたとします。この拡張メソッドは非常に特殊なものであり、非常に2つのテーブルで作業が完了します。一般的なカスタム結合拡張メソッド

2つのテーブルを結合してデータを投影するためにGENERIC拡張メソッドを作成するには何が必要ですか?

マイコード:TableA

スキーマ:TableB

CREATE TABLE [dbo].[TableA](
    [Id_1] [int] IDENTITY(1,1) NOT NULL, 
    [Name] [nvarchar](max) NULL, 
    [Address] [nvarchar](max) NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id_1] ASC 
) 

スキーマ:

CREATE TABLE [dbo].[TableB](
    [Id_2] [int] IDENTITY(1,1) NOT NULL, 
    [Name2] [nvarchar](max) NULL, 
    [Address2] [nvarchar](max) NULL, 
    [FK_Id] [int] NULL, 
PRIMARY KEY CLUSTERED 
(
    [Id_2] ASC 
) 
ALTER TABLE [dbo].[TableB] WITH CHECK ADD FOREIGN KEY([FK_Id]) 
REFERENCES [dbo].[TableA] ([Id_1]) 

C#コード:

public class ABDTO 
    { 
     public TableA A { get; set; } 
     public TableB B { get; set; } 
    } 

public static class Helper 
    { 
     public static IEnumerable<ABDTO> Join(this IEnumerable<TableA> tableA,IEnumerable<TableB> tableB) 
     { 
      return tableA.Join(tableB,x => x.Id_1,y => y.FK_Id, 
            (x, y) =>new ABDTO 
             { 
              A = x, 
               B = y 
              }); 
       } 

public class Program 
    { 
     static void Main(string[] args) 
     { 
      Operation1(); 
      Console.ReadLine(); 
     } 

     public static void Operation1() 
     { 
      using (var db = new SampleEntities()) 
      { 
       var result = db.TableAs.Join(db.TableBs); 

       foreach(var item in result) 
       { 
        Console.WriteLine("{0}; {1} ||| {2} ; {3}", item.A.Id_1, item.A.Name, item.B.Id_2, item.B.Name2); 
       } 
      } 
     } 
    } 

ので、Join()extension methodであり、TableATableBを取り込み、それらをPK-FK関係に加えてセレクタを投影します。私は何かgenericを書くことができますどのように

:私はLINQExtension methodsには非常に良好ではないです

public static IEnumerable<T> Join(this IEnumerable<T> Ta, IEnumerable<T> Tb) 
     { 
      return Ta.Join(Tb, x => Ta.SomeColumn1, y => Tb.SomeColumn2, 
           (x, y) => Projection of columns); 
     } 

、助けてください。 ポインタも役立ちます。

+0

パラメータとして列名を受け入れてみましたか? Func <>デリゲートを 'Join'メソッドのパラメータとして使用している場合は、コーリングコードから結合に使用する列を指定することができます。したがって、 'Join'拡張内でハードコーディングする必要はありません。 –

+0

@ SIva Gopal ...私はあなたを正しく取得していません。もっと説明できますか? – DevAssasin

+0

"結合可能な"列を自動検出する方法を探しているようです。問題は、どの自動化されたプロシージャがあなたが参加したいことを知っているのでしょうか?名前の慣習(等名)だけで? –

答えて

0

私はいくつかのR & Dを行い、解を導き出すことができました。

public class ABDTO<T,U> 
    { 
     public T A { get; set; } 
     public U B { get; set; } 
    } 
    public static class Helper 
    { 
     public static IQueryable<ABDTO<T,U>> JoinEx<T,U,Key>(this IQueryable<T> tableA,IQueryable<U> tableB, Expression<Func<T, Key>> column1, Expression<Func<U, Key>> column2) 
     { 
      return tableA.Join(tableB, column1, column2, (y, z) => new ABDTO<T,U> {A= y, B=z }); 
     } 
    } 

JoinEx<>() 2列に基づいてそれらを結合、種類TUの2つのテーブルに取る汎用extension方法であり、そしていくつかの一般的なDTOで結果を突出。

それは以下のように呼ばれています:私はそこに多分性能制約を理解し、これらの操作の種類がstored procedureとしてdatabaseで実行する必要がありますが、一般的なもののこの種のための要件が​​あります

using (var db = new SampleEntities()) 
      { 
       var result=db.TableAs.JoinEx<TableA, TableB, int>(db.TableBs, x => x.Id_1, y => y.FK_Id); 
       foreach(var item in result) 
       {    
         Console.WriteLine("{0} \t {1}",item.A.Name,item.B.Name2);          
       } 
      } 

ありがとうございました

関連する問題