Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Linq вопрос / 15 сообщений из 15, страница 1 из 1
19.12.2012, 08:11
    #38084458
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Мне необходимо выполнить примерно следующий запрос в Linq из двух DataTable

Код: sql
1.
2.
3.
4.
5.
Select Ingridient, Sum(Netto), Sum(Brutto) From 
  ( Select Ingridient, Netto, Brutto from Table1   
  Union all
Select Ingridient, Netto, Brutto from Table2 ) as t1
Group by t1.Ingridient
...
Рейтинг: 0 / 0
19.12.2012, 08:20
    #38084461
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Ведущий инженер-программист не умеет задавать вопросы, пользоваться документацией и гуглом? Стыдно...
...
Рейтинг: 0 / 0
19.12.2012, 10:39
    #38084595
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Мне не стыдно. Лучше один раз задать вопрос, чем быть не вежой :-)
У меня получилось следующее, но не эффективно и главное все равно не группирует и суммирует, а просто объединяет данные.
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
   CultureInfo objCulture = CultureInfo.CurrentCulture ;
                NumberFormatInfo objFormat = (NumberFormatInfo)objCulture.NumberFormat.Clone();
                objFormat.NumberDecimalSeparator = ".";

                var objSourceLinq =
                                from s in objSourceTable.AsEnumerable()
                                select new { IngridientName = s["IngridientName"].ToString(), sNetto = double.Parse(s["sNetto"].ToString(), objFormat), sBrutto = double.Parse(s["sBrutto"].ToString(), objFormat) };

                var objDestLinq =
                                from s in dsChanges.Tables["DestItems"].AsEnumerable()
                                select new { IngridientName = s["IngridientName"].ToString(), sNetto = double.Parse(s["sChangeNetto"].ToString(), objFormat), sBrutto = double.Parse(s["sChangeBrutto"].ToString(), objFormat) };

                var objResultLinq = objSourceLinq.Union(objDestLinq);

                var objLinq = from s in objResultLinq
                              group s by s.IngridientName  into g
                              select new { IngridientName = g.Key, 
                                           sNetto = g.Sum(s =>Convert .ToDouble (s.sNetto)  ) ,
                                           sBrutto = g.Sum (s=>Convert.ToDouble ( s.sBrutto) )
                                         };
...
Рейтинг: 0 / 0
19.12.2012, 10:55
    #38084622
Ken@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
valex13,
Оно не стыдно, оно позорно делать конвертацию string- double-string-double, потом аггрегировать. Вообще этот код ужасен с логической точки зрения
...
Рейтинг: 0 / 0
19.12.2012, 11:12
    #38084650
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
valex13Мне не стыдно. Лучше один раз задать вопрос, чем быть не вежой :-)
Так задай этот вопрос нормально по-человечески. В чем сложность написать тестовый пример наполнения коллекций и попытки дернуть запрос из них, сразу бы получил ответы?
Пример , как правильно задавать вопросы.
...
Рейтинг: 0 / 0
19.12.2012, 11:22
    #38084666
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
valex13чем быть не вежой
написав раздельно автор предполагает, что можно быть вежой?
...
Рейтинг: 0 / 0
19.12.2012, 11:30
    #38084676
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
винский, старик, как оно? всё гавнокодишь али в бизнесы подалсо? :)
...
Рейтинг: 0 / 0
19.12.2012, 11:38
    #38084694
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
valex13Мне не стыдно.Зря. Не хочу обидеть, но с одной стороны иметь такое резюме, с другой задавать вопросы такого уровня. Меня это несколько удивляет.
...
Рейтинг: 0 / 0
19.12.2012, 11:47
    #38084713
winsky!
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
МСУ,

говнокодю.
учу других говнокодить. ну его, этот бизнес. говнокодить прикольнее
...
Рейтинг: 0 / 0
19.12.2012, 11:57
    #38084730
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Алексей Кvalex13Мне не стыдно.Зря. Не хочу обидеть, но с одной стороны иметь такое резюме, с другой задавать вопросы такого уровня. Меня это несколько удивляет.
Особенно порадовал каммент о банке "Радиан" :)
...P.S. Контора страшно жадная, но зато там очень весело. Что не день, то проблема :-)

winsky!МСУ,
говнокодю.
учу других говнокодить. ну его, этот бизнес. говнокодить прикольнее
Согласен :) тем более зная уровень хохляцких спецов - тому лишнее подтверждение, что кодеманство это наше всё. Ваши попугайчики на вес золота у нас - и качество и цена, это любой интегратор скажет. А наши пернатые - зажравшиеся ленивые обормоты, совращенные жизнью в столицах. Расстрелятьнах (с) Дальневосточные братья
...
Рейтинг: 0 / 0
19.12.2012, 12:27
    #38084814
spaceman81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
ИМХО, так:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class CRec
    {
        public string Ingridient { get; set; }
        public double Netto { get; set; }
        public double Brutto { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List<CRec> Table1 = new List<CRec>();
            List<CRec> Table2 = new List<CRec>();
            /*
             ... ЗАПОЛНЯЮ Table1 и Table2 данными от балды... 
             */
            Table1.Add(new CRec { Ingridient = "I1", Netto = 5, Brutto = 6 });
            Table1.Add(new CRec { Ingridient = "I2", Netto = 1, Brutto = 2 });
            Table1.Add(new CRec { Ingridient = "I1", Netto = 5, Brutto = 6 });
            Table2.Add(new CRec { Ingridient = "I1", Netto = 1, Brutto = 3 });
            /*
             * Собственно, сам запрос
             * Если нужно union all - то Concat,
             * Если нужно union - то Union
             */
            var v_res = Table1.Concat(Table2).GroupBy(a => a.Ingridient).
                Select(r => new { Ingridient = r.Key,
                                  SumNetto = r.Sum(a=>a.Netto),
                                  SumBrutto = r.Sum(a => a.Brutto)
                });
            //Вывод результата
            foreach (var v in v_res)
            {
                Console.WriteLine("Ingridient = {0};\tSumNetto= {1};\tSumBrutto={2};",
                    v.Ingridient, v.SumNetto, v.SumBrutto);
            }
            Console.ReadKey();
        }
    }
}
...
Рейтинг: 0 / 0
19.12.2012, 15:19
    #38085261
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
spaceman81ИМХО, так:

Вы вопрос читали?
Код: c#
1.
2.
3.
4.
5.
6.
7.
DataTable t1, DataTable t2;
.....заполняем значениями.....
Func<DataRow, Tuple<string, double, double>> Convert = r => Tuple.Create(r.Field<string>("Ingridient"), r.Field<double>("Netto"), r.Field<double>("Brutto"));
            var res = t1.AsEnumerable().Select(r1 => Convert(r1))
                  .Union(t2.AsEnumerable().Select(r2 => Convert(r2)))
                  .GroupBy(t => t.Item1)
                  .Select(t => Tuple.Create(t.Key, t.Sum(s => s.Item2), t.Sum(s => s.Item3)));
...
Рейтинг: 0 / 0
19.12.2012, 20:11
    #38085798
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Можно еще так:) Не уверен в краткости...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
open System.Data

let convert (dt:DataTable)=
    Seq.cast<DataRow> dt.Rows
    |> Seq.map (fun r -> (string (r.Item "Ingridient")), r.Item "Netto" :?> double, r.Item "Brutto" :?> double )  

    
let func(dt1, dt2)=     
    Seq.concat [convert dt1; convert dt2]
    |> Seq.groupBy (fun (a, _, _) -> a)
    |> Seq.map (fun (a, b) ->
                (a, 
                    Seq.map (fun(_,s,_)->s) b
                    |> Seq.sum,
                    Seq.map (fun(_,_,s)->s) b
                    |> Seq.sum
                    ))
...
Рейтинг: 0 / 0
19.12.2012, 21:15
    #38085855
spaceman81
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
ЕвгенийВspaceman81ИМХО, так:

Вы вопрос читали?
Код: c#
1.
2.
3.
4.
5.
6.
7.
DataTable t1, DataTable t2;
.....заполняем значениями.....
Func<DataRow, Tuple<string, double, double>> Convert = r => Tuple.Create(r.Field<string>("Ingridient"), r.Field<double>("Netto"), r.Field<double>("Brutto"));
            var res = t1.AsEnumerable().Select(r1 => Convert(r1))
                  .Union(t2.AsEnumerable().Select(r2 => Convert(r2)))
                  .GroupBy(t => t.Item1)
                  .Select(t => Tuple.Create(t.Key, t.Sum(s => s.Item2), t.Sum(s => s.Item3)));


Читали.
В вопросе SQL-запрос, который нужно отобразить в Linq. Что я и сделал. Плюс для примера привел полный текст test-кейса, чтобы можно было его легко воспроизвести. То что использовал List<T> вместо DataTable - не думаю что преобразование данных к нужному типу в контексте данного вопроса так важно, тем более оно элементарно.
...
Рейтинг: 0 / 0
20.12.2012, 18:12
    #38087242
valex13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Linq вопрос
Спасибо за советы. Все получилось.

Ken@tvalex13,
Оно не стыдно, оно позорно делать конвертацию string- double-string-double, потом аггрегировать. Вообще этот код ужасен с логической точки зрения

Все когда то учились. Я привел в пример первое , что получилось. Это мой первый опыт LINQ. Еще раз спасибо.
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Linq вопрос / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]