powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Сложный LINQ запрос
10 сообщений из 35, страница 2 из 2
Сложный LINQ запрос
    #37224204
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stimpi
И еще у вас учитывается только вариант когда только MAX_VALUE и MIN_VALUE заданы. В реальности может быть что только один из них может быть задан. Спасибо.
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224331
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stimpiтак почему не можете сделать группировку ? что за ошибка ?
Не получается и все :( Я LINQ очень плохо знаю...
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224364
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonstimpiтак почему не можете сделать группировку ? что за ошибка ?
Не получается и все :( Я LINQ очень плохо знаю...

Код: plaintext
.GroupBy(x => x.Data.OPCHDADateTime.AddMinutes(-x.Data.OPCHDADateTime.Minute % 3).AddSeconds(-x.Data.OPCHDADateTime.Second).AddMilliseconds(-x.Data.OPCHDADateTime.Millisecond))

как-то так.
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224388
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или еще как вариант:

Код: plaintext
1.
2.
3.
4.
5.
var periodTicks = TimeSpan.FromMinutes(3).Ticks;

...


.GroupBy(x => new DateTime(x.Data.OPCHDADateTime.Ticks / periodTicks * periodTicks)
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224418
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И с учетом

авторТут еще один нюанс, я конечное дико извиняюсь, но я не правильно интервалы 3-х минуток указал.
Вот так должно быть правильно: данные что лежат в интервале с 07:57:00.000 до 08:00:00.000 - среднее со временем 08:00:00.000, с 08:00:00.000 до 08:03:00.000 - среднее со временем 08:03:00.000, с 08:03:00.000 до 08:06:00.000 - среднее со временем 08:06:00.000, ...., с 08:57:00.000 до 09:00:00.000 - среднее со временем 09:00:00.000 .
Спасибо.

Код: plaintext
.GroupBy(x => new { x.Par, Date = new DateTime(x.Data.OPDateTime.Ticks / periodTicks * periodTicks + periodTicks) })
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224480
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Верблюд
Код: plaintext
.GroupBy(x => new { x.Par, Date = new DateTime(x.Data.OPDateTime.Ticks / periodTicks * periodTicks + periodTicks) })

А здесь миллисекунды тоже учитываются?
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224484
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
renatonВерблюд
Код: plaintext
.GroupBy(x => new { x.Par, Date = new DateTime(x.Data.OPDateTime.Ticks / periodTicks * periodTicks + periodTicks) })

А здесь миллисекунды тоже учитываются?

Здесь учитывается
Код: plaintext
var periodTicks = TimeSpan.FromMinutes(3).Ticks;
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37224534
Фотография Верблюд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окончательный вариант на текущий момент такой:

Код: plaintext
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.
48.
49.
50.
51.
52.
53.
            var periodTicks = TimeSpan.FromMinutes(3).Ticks;

            List<OPRecieveData> values = new List<OPRecieveData>
            { 
                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:00:00.000"), Value = 250 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:00:00.000"), Value = 1000 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:00:00.000"), Value = 10 },
                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:00:01.000"), Value = 260 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:00:01.000"), Value = 1050 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:00:01.000"), Value = 11 },
                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:00:02.000"), Value = 255 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:00:02.000"), Value = 1080 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:00:02.000"), Value = 9 },

                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:03:00.000"), Value = 240 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:03:00.000"), Value = 1010 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:03:00.000"), Value = 12 },
                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:03:01.000"), Value = 245 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:03:01.000"), Value = 1050 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:03:01.000"), Value = 13 },
                new OPRecieveData { OPTag = "tag1", OPDateTime = DateTime.Parse("18.04.2011 08:03:02.000"), Value = 270 },
                new OPRecieveData { OPTag = "tag2", OPDateTime = DateTime.Parse("18.04.2011 08:03:02.000"), Value = 1070 },
                new OPRecieveData { OPTag = "tag3", OPDateTime = DateTime.Parse("18.04.2011 08:03:02.000"), Value = 14 },
            };

            List<OPData> par = new List<OPData>
            {
                new OPData { ID = 101, TAG="tag1", Name="Parameter1", MIN_VALUE=200, MAX_VALUE=300 },
                new OPData { ID = 102, TAG="tag2", Name="Parameter2", MIN_VALUE=900, MAX_VALUE=1100 },
                new OPData { ID = 103, TAG="tag3", Name="Parameter3", MIN_VALUE=null, MAX_VALUE=null },
            };

            var query = values
                // объединяем по тегу
                .Join(par, v => v.OPTag, v => v.TAG, (d, p) => new { Data = d, Par = p })
                // применяем фильтр
                .Where(x => (x.Par.MIN_VALUE == null || x.Data.Value >= x.Par.MIN_VALUE)
                    && (x.Par.MAX_VALUE == null || x.Data.Value <= x.Par.MAX_VALUE))
                // группируем данные
                .GroupBy(x => new { x.Par, Date = new DateTime(x.Data.OPDateTime.Ticks / periodTicks * periodTicks + periodTicks) })
                // выбираем данные
                .Select(g => new
                {
                    ID = g.Key.Par.ID,
                    TAG = g.Key.Par.TAG,
                    Name = g.Key.Par.Name,
                    DateTime = g.Key.Date,
                    Value = g.Average(t => t.Data.Value)
                });

            foreach (var x in query)
            {
                Console.WriteLine("{0}, {1}, {2}, {3}, {4}", x.ID, x.TAG, x.Name, x.DateTime, x.Value);
            }
...
Рейтинг: 0 / 0
Сложный LINQ запрос
    #37225083
stimpi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
renatonstimpi
И еще у вас учитывается только вариант когда только MAX_VALUE и MIN_VALUE заданы. В реальности может быть что только один из них может быть задан. Спасибо.
Код: plaintext
1.
where d.Value >= (r.MIN_VALUE.HasValue ? r.MIN_VALUE : d.Value) &&
                        d.Value <= (r.MAX_VALUE.HasValue ? r.MAX_VALUE : d.Value)

ничего подобного )
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Сложный LINQ запрос
    #38347007
renaton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос № 2 :
Доброго дня!
Имеются такие классы:
Код: 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.
48.
49.
50.
//Класс для хранения настроек
public class OPData
    {
        public int ID
        {
            get;
            set;
        }
        public string TAG
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        [DefaultValue(null)]
        public Nullable<double> MIN_VALUE
        {
            get;
            set;
        }
        [DefaultValue(null)]
        public Nullable<double> MAX_VALUE
        {
            get;
            set;
        }     
    }
//Класс для хранения значений
public class OPRecieveData
    {
        public string OPTag
        {
            get;
            set;
        }
        public DateTime OPDateTime
        {
            get;
            set;
        }
        public double Value
        {
            get;
            set;
        }
    }


Используя класс OPRecieveData так:
Код: c#
1.
IList<OPRecieveData> Values = new IList<OPRecieveData>();

и в нем будут хранится секундные значения вида:
OPTagOPDateTimeValuetag118.04.2011 08:00:00.000250tag218.04.2011 08:00:00.0001000tag318.04.2011 08:00:00.00010tag118.04.2011 08:00:01.000260tag218.04.2011 08:00:01.0001050tag318.04.2011 08:00:01.00011tag118.04.2011 08:00:02.000255tag218.04.2011 08:00:02.0001080tag318.04.2011 08:00:02.0009.........tag118.04.2011 08:03:00.000240tag218.04.2011 08:03:00.0001010tag318.04.2011 08:03:00.00012tag118.04.2011 08:03:01.000245tag218.04.2011 08:03:01.0001050tag318.04.2011 08:03:01.00013tag118.04.2011 08:03:02.000270tag218.04.2011 08:03:02.0001070tag318.04.2011 08:03:02.00014.........
Используя класс OPData так:
Код: c#
1.
IList<OPData> Params = new IList<OPData>();

и в нем будут хранится описание каждого параметр в виде:
IDTAGNameMIN_VALUEMAX_VALUE101tag1Parameter1200300102tag2Parameter29001100103tag3Parameter3nullnull104tag4Parameter4nullnull105tag5Parameter51001000
то есть MIN_VALUE и MAX_VALUE могут быть null, т.е. не задан интервал.
Вопрос: Используя LINQ необходимо получить на выходе усредненное 3-х минутное значение то есть брать интервал в 3 минуты с 00:00 до 00:03, 00:06 и т.д. и среднее находить так если указаны MIN_VALUE и MAX_VALUE - брать только те значения которые в заданном интервале, если не заданы, то брать все значения. Если по параметрам нет значений в Values, то в значении вернуть 0. То есть надо в результате получить что-то в виде:
IDTAGNameDateTimeValue101tag1Parameter118.04.2011 08:00:00.000255102tag2Parameter218.04.2011 08:00:00.0001043.33103tag3Parameter318.04.2011 08:00:00.00010104tag4Parameter418.04.2011 08:00:00.0000105tag5Parameter518.04.2011 08:00:00.0000101tag1Parameter118.04.2011 08:03:00.000251.66102tag2Parameter218.04.2011 08:03:00.0001043.33103tag3Parameter318.04.2011 08:03:00.00013104tag4Parameter418.04.2011 08:03:00.0000105tag5Parameter518.04.2011 08:03:00.0000...............
Как это можно записать на LINQ? Спасибо.
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Сложный LINQ запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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