2013-09-26 4 views
0

В linq я пытаюсь присоединиться к datatables. Теперь, как я могу группировать по запросу linq. Что я пробовал до сих пор.Группа по условию в linq? Соединение таблицы в 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. помочь мне
Из вышеприведенного LINQ я получаю данные, как:

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

Я хочу быть выше результат, как:

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

Я пытался так:

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

вышеупомянутый запрос 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" в группе. если «InvoiceQuanity» - это то же самое, тогда сумма другая разумна - это не сумма. тот же «Invoicevalue», если invoicevalue такой же, как 450, тогда он суммирует другие мудрые данные не является суммой

+0

Wel l Какие исследования вы сделали для группировки в LINQ? Поиск «group by linq msdn» получает множество результатов ... –

+0

yeah jon Skeet, но я хочу группу больше, чем на столбец, который я попробовал: group new {table1, table2} by table2.Field («Quationno») в саси. но я хочу больше, чем один Fild, например, Emdno, customercode –

+1

Поиск «группы по нескольким столбцам linq» в Stack Overflow, и вы получите * lots * хитов ... –

ответ

0

Извините, не может размещать это в качестве комментария, но мне не хватает 50 репутации, чтобы сделать это. Вы указываете поле «InvoiceQuantity» как строку в выражении группы и как десятичное число в выборе.

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


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

Вы должны бросить строку в десятичное, прежде чем вы можете использовать SUM-функцию:

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

Если это уже десятичное поле просто сохранить его в виде десятичных чисел в группе высказыванием:

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

EDIT:

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

Г-н abeldenibus, я добавил мой запрос на поздний срок, пожалуйста, отметьте один раз –

+0

@Suryasasidhar: попробуйте удалить InvoiceQuantity и InvoiceValue из группового оператора. Кажется, это не колонка, которую вы хотите группировать, но вы хотели бы подвести итоги независимо от того, что это за значение. Поместите только те столбцы в оператор группы, которые вы действительно хотите группировать. Если у вас есть другой InvoiceQuantity/InvoiceValue и поместить его в оператор группы, вы получите новую строку результатов для каждого отдельного значения в этих столбцах, а сумма будет только суммой этого конкретного значения. – abeldenibus

+0

Большое спасибо, adeldenibus работает нормально. Я снова проведу тест для другого тестового примера, после чего я помету ваш ответ, повторюсь еще раз для ответа. –

Смежные вопросы