2013-09-26 3 views
0

linq에서 datatables에 가입하려고합니다. 이제 어떻게 linq 쿼리에 의해 그룹화 할 수 있습니다. 나는 지금까지 무엇을 시도했다.linq의 그룹 by 절? linq에 테이블에 가입 하시겠습니까?

var resultstatu = from table1 in dtFetch.AsEnumerable() 
        join table2 in dssap.AsEnumerable() on (string)table1["SAPQuotationNo"] equals (string)table2["Quationno"] 
        select new { 
           EMDNo = (int)table1["EMDNo"], 
           Quationno = (string)table2["Quationno"], 
           CustomerCode = (string)table2["CustomerCode"], 
           InvoiceQuantity = (string)table2["InvoiceQuantity"], 
           InvoiceValue = (string)table2["InvoiceValue"]          
          }; 

이제 위의 linq에 대한 그룹을 작성하고 싶습니다.

var resultstatu = from table1 in dtFetch.AsEnumerable() 
            join table2 in dssap.AsEnumerable() on (string)table1["SAPQuotationNo"] equals (string)table2["Quationno"] 
            group new { table1, table2 } by 
             new 
             { 
              Quationno = table2.Field<string>("Quationno"), 
              MaterialCode = table2.Field<string>("MaterialCode"), 
              EMDNo = table1.Field<int>("EMDNo"), 
              QuotationDate= table2.Field <string>("QuotationDate"), 
              QuotionQuantity = table2.Field<string>("QuotionQuantity"), 
              InvoiceQuantity = table2.Field<string>("InvoiceQuantity"), 
              InvoiceValue = table2.Field<string>("InvoiceValue"), 
              MaterialName = table2.Field<string>("MaterialName"), 
             } 
             into sasi 

             select new { 

              EMDNo = sasi.Key .EMDNo , 
              Quationno= sasi.Key.Quationno , 
              QuotationDate=sasi.Key.QuotationDate , 
              MaterialCode= sasi.Key.MaterialCode , 
              QuotionQuantity=sasi.Key.QuotionQuantity ,            
              MaterialName=sasi .Key.MaterialName, 
              InvoiceQuantity = Convert.ToString(sasi.Sum(x => x.table2.Field<decimal>("InvoiceQuantity"))), 
              InvoiceValue = Convert.ToString(sasi.Sum(x => x.table2.Field<decimal>("InvoiceValue"))) 

              //InvoiceQuantity = sasi.Key.InvoiceQuantity, 
              //InvoiceValue = sasi.Key.InvoiceValue 
             }; 

:

EMDNO  QuationNo CustomerCode InvoiceQuantity Invoicevalue 
-----  --------- ------------ -------------- ----------- 
1234  16001  H152    40.00   9000 

는이 같은 시도 : 나는 위의 결과처럼되고 싶어

EMDNO  QuationNo CustomerCode InvoiceQuantity Invoicevalue 
-----  --------- ------------ ------------- ------------- 
1234  16001  H152   20.00   450 
1234  16001  H152   20.00   450 

: 내가 좋아하는 데이터를 얻고 위의 LINQ에서 나에게
도움 위의 linq 쿼리는 예외를 발생시키고 있습니다. 지정된 캐스트에 문제가있다.

var resultstatu = from table1 in dtFetch.AsEnumerable() 
            join table2 in dssap.AsEnumerable() on (string)table1["SAPQuotationNo"] equals (string)table2["Quationno"] 
            group new { table1, table2 } by 
             new 
             { 
              Quationno = table2.Field<string>("Quationno"), 
              MaterialCode = table2.Field<string>("MaterialCode"), 
              EMDNo = table1.Field<int>("EMDNo"), 
              QuotationDate = table2.Field<string>("QuotationDate"), 
              QuotionQuantity = table2.Field<string>("QuotionQuantity"), 
              InvoiceQuantity = table2.Field<string>("InvoiceQuantity"), 
              InvoiceValue = table2.Field<string>("InvoiceValue"), 
              MaterialName = table2.Field<string>("MaterialName"), 
             } 
             into sasi 

             select new { 

              EMDNo = sasi.Key .EMDNo , 
              Quationno= sasi.Key.Quationno , 
              QuotationDate=sasi.Key.QuotationDate , 
              MaterialCode= sasi.Key.MaterialCode , 
              QuotionQuantity=sasi.Key.QuotionQuantity ,            
              MaterialName=sasi .Key.MaterialName, 

              InvoiceQuantity = sasi.Sum((r) => decimal.Parse(r.table2.Field<string>("InvoiceQuantity"))).ToString(), 

              InvoiceValue = sasi.Sum((r) => decimal.Parse(r.table2.Field<string>("InvoiceValue"))).ToString() }           
             ; 

그러나이 그룹에서 "invoicequantity, invoicevalue"을 고려하고 위의 쿼리에서 :

는 내가 LINQ 아래처럼 시도했다. "InvoiceQuanity"가 같으면 합계가 아닌 합계가됩니다. 같은 invoicevalue 만약 invoicevalue가 450과 같으면 합계가 다른 것이 합계입니다

+0

아 l LINQ에서 어떤 연구를 그룹화 했습니까? "group by linq msdn"에 대한 검색 결과가 많습니다 ... –

+0

예 존 스킵,하지만 열보다 많은 그룹을 원합니다. 시도 : group2.Field ("Quationno")에 의해 그룹 new {table1, table2} sasi에. 하지만 난 Emdno, customercode 같은 하나 이상의 fild 싶어요 –

+1

스택 오버플로에서 "다중 열 linq에 의해 그룹"에 대한 검색 및 당신은 안타의 * lots *를 얻을거야 ... –

답변

0

죄송합니다.이 의견을 게시 할 수는 없지만 그렇게 할만한 평판은 없습니다. 필드 "InvoiceQuantity"를 그룹 문에서 문자열로 지정하고 선택 항목에서 소수로 처리합니다.

Convert.ToString(sasi.Sum(x => Decimal.Parse(x.table2.Field<String>("InvoiceQuantity")))), 

는 이미 진수 필드 그냥 그룹 문에서 소수로 저장하는 경우 :

InvoiceQuantity = table2.Field<string>("InvoiceQuantity"), 


InvoiceQuantity = Convert.ToString(sasi.Sum(x => x.table2.Field<decimal>("InvoiceQuantity"))), 

당신은 당신이 합계 기능을 사용하기 전에 진수 문자열을 캐스팅해야

InvoiceQuantity = table2.Field<decimal>("InvoiceQuantity"), 

편집 :

var resultstatu = from table1 in dtFetch.AsEnumerable() 
        join table2 in dssap.AsEnumerable() on (string)table1["SAPQuotationNo"] equals (string)table2["Quationno"] 
        group new { table1, table2 } by 
         new 
         { 
          Quationno = table2.Field<string>("Quationno"), 
          MaterialCode = table2.Field<string>("MaterialCode"), 
          EMDNo = table1.Field<int>("EMDNo"), 
          QuotationDate = table2.Field<string>("QuotationDate"), 
          QuotionQuantity = table2.Field<string>("QuotionQuantity"), 
          MaterialName = table2.Field<string>("MaterialName"), 
         } 
         into sasi 

         select new 
         { 

          EMDNo = sasi.Key.EMDNo, 
          Quationno = sasi.Key.Quationno, 
          QuotationDate = sasi.Key.QuotationDate, 
          MaterialCode = sasi.Key.MaterialCode, 
          QuotionQuantity = sasi.Key.QuotionQuantity, 
          MaterialName = sasi.Key.MaterialName, 

          InvoiceQuantity = sasi.Sum((r) => decimal.Parse(r.table2.Field<string>("InvoiceQuantity"))).ToString(), 

          InvoiceValue = sasi.Sum((r) => decimal.Parse(r.table2.Field<string>("InvoiceValue"))).ToString() 
         }; 
+0

Mr. Abeldenibus, 내 lates 쿼리를 추가했습니다. 한 번 확인하십시오. –

+0

@Suryasasidhar : 그룹 명세서에서 InvoiceQuantity 및 InvoiceValue를 제거하십시오. 그룹화하려는 열이 아닌 것처럼 보이지만 가치가 무엇이든 상관없이 요약하십시오. 그룹화하려는 그룹 문에 실제로 그룹화하려는 열만 입력하십시오. InvoiceQuantity/InvoiceValue가 다르거 나 그룹 문에 넣으면이 열의 모든 단일 값에 대해 새로운 결과 행을 가져 오며 합계는이 특정 값의 합계입니다. – abeldenibus

+0

대단히 감사합니다. adeldenibus가 잘 작동합니다. 다른 테스트 케이스에 대해 다시 테스트 한 다음 답을 표시하고 답장을 다시 한 번 보냅니다. –