2016-06-20 2 views
-1

두 테이블이 TableATableB이고 PK-FK 관계가 있다고 가정하면이 두 테이블을 extension method에서 join으로 작성하고 데이터를 가져 왔습니다. 이 확장 메소드는 매우 구체적이며 이러한 매우 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 <> delegate를 '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 열을 기준으로 그들과 합류하고, 몇 가지 일반적인 DTO에 결과를 프로젝트, 유형 TU 2 개 테이블에 걸리는 일반적인 extension 방법이다.

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);          
       } 
      } 

내가 거기 어쩌면 성능의 제약을 이해하고 작업의 이러한 종류는 stored proceduredatabase에서 수행해야하지만 일반적인 물건의 종류에 대한 요구 사항이있다 :

아래로라고합니다.

감사합니다.