2010-12-22 2 views
0

데이터베이스의 데이터가있는 DataTable 개체가 있다고 가정 해 봅시다. 다시 구성해야합니다. 나는 (나의 연구에 따르면) LINQ는 우아 할 것이라고 생각한다. 문제는 방법입니다.DataTable 개체에서 LINQ 쿼리 수행

데이터는 당신이 방법 열이 동적 될 것입니다 볼 수 있듯이

ORDER SAMPLE ASH-10 ASH-11 ASH-12 BSH-10 BSH-11 BSH-12 
1234 1  Y  Y  Y  N  N N 
1234 2  Y  N  Y  N  N N 
1234 5  Y  N  N  N  N N 
1235 1  N  N  N  N  Y Y 

로 개편 할 필요 다음과 같은 형식

ORDER SAMPLE METHOD  

1234 1  ASH-10   
1234 1  ASH-11 
1234 1  ASH-12 
1234 2  ASH-10  
1234 2  ASh-12 
1234 5  ASH-10 
1235 1  BSH-10 
1235 1  BSH-11 
1235 1  BSH-12 

의 데이터베이스에서 온다. 물론 구형 루프를 사용하여 데이터를 반복 할 수는 있지만 LINQ가 더 빠르고 더 좋은 방법이 될 것 같습니다. 내가 틀렸다면 나를 바로 잡아라.

답변

2

DataTable은 데이터베이스에서 응용 프로그램으로 데이터를 검색하는 데 적합하지만 데이터를 가져 오면 일반적으로이를 사용자 지정 개체로 변환하는 것이 좋습니다.

귀하의 예비 설계는 다음과 같습니다

class AllOrders 
{ 
    public static List<Order> Orders = new List<Order>(); 
    public static List<Method> Methods = new List<Method>(); 

    public static void ProcessTable(DataTable dt) 
    { 
     foreach (DataRow dr in dt.Rows) 
     { 
      int sampleId = Convert.ToInt32(dr["SAMPLE"]); 
      string methodName = Convert.ToString(dr["Method"]); 
      AddOrder(sampleId, methodName); 
     } 
    } 

    private static void AddOrder(int SampleId, string methodName) 
    { 
     Method m = Methods.FirstOrDefault(x => x.Name == methodName); 
     if (m == null) 
     { 
      m = new Method(methodName); 
      Methods.Add(m); 
     } 
     Order o = new Order(SampleId, m); 
     Orders.Add(o); 
    } 
} 

class Order 
{ 
    public Order(int sampleId, Method m) 
    { 
     this.Method = m; 
     this.SampleId = sampleId; 
    } 
    public int SampleId; //a more mature design might have a Sample class instead. 
    public Method Method; 

} 

class Method 
{ 
    public string Name; 
    public Method(string name) 
    { 
     this.Name = name; 
    } 
} 
+0

@gnomixa 여전히 작동해야합니다. 그냥'SampleId'와'OrderId'에 집계하고 각각에 대해'Method' 컬렉션을 만듭니다. Y/N 열은 없지만 실제로 원하는 것은 있습니까? –

+0

그렉, 답변 해 주셔서 감사합니다. 편집 내용이 훌륭합니다. 동의로 표시 하겠지만 궁극적으로 루프를 사용하여 끝났습니다. 아래 답변을 참조하십시오. – sarsnake

0

그러한 경우 (SQL 서버 2005)에 Dynamic Pivoting를 사용하는 것이 좋습니다.

오라클 11g는 Pivoting을 지원합니다. 더 낮은 버전을 위해 당신은 this 또는 this를 볼 수있다. 심지어 구글 검색은 많은 예제를 만들어 낼 것이다.

+0

우리는 db를 위해 Oracle을 사용합니다. – sarsnake

1

루프를 사용하여 데이터를 반복 및 정렬했습니다. 객체를 채우는 접근법은 여기서 약간 중복되었습니다. 웹 서비스이므로 필요한 것은 데이터를 정렬하고 반환하는 것입니다. 그래서 나는 그것을 간단하게 유지했다.