LINQ получает последние записи - PullRequest
0 голосов
/ 09 мая 2011

Я довольно новичок в LINQ, так что это может быть простым решением для некоторых из вас.Я уже довольно долго рву волосы:)

Сценарий: у меня есть коробка с 3 аппаратными модулями, имеющими разные порты.Используя последовательную связь, я извлекаю данные из модулей в таблицу SQL с именем CurrentData_Tables. Поэтому каждый раз, когда создается единица, моя программа записывает в таблицу запись о том, насколько велика сумма.Позвольте мне попытаться объяснить данные.

BoxID, ModuleID, PortNumber, Value,       Time
1,     0A,       1,          {Value},     {Date}

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

SQLdbDataContext sqlDB = new SQLdbDataContext();
BindingSource bs = new BindingSource();
var Latest = from q in sqlDB.CurrentData_Tabels
             group q by new
             {
                 q.BoxID,
                 q.ModuleID,
                 q.PortNumber,
                 q.Time
             }
             into groupOrder
             select new
             {
                 BoxID = groupOrder.Key.BoxID,
                 ModuleID = groupOrder.Key.ModuleID,
                 Portnumber = groupOrder.Key.PortNumber,
                 Time = groupOrder.Key.Time
             };

И это прекрасно, потому что я получаю все результаты, которые хочу, и даже больше.Мне не нужно знать, что показания на модуле 0A, порт 1 подсчитали до 2 до последней записи 3. Имеет ли это смысл?Если нет, пожалуйста, позвольте мне попытаться объяснить это снова.

Выполнение> для получения наибольшей суммы не будет работать, так как у меня также есть состояния, которые срабатывают для значений bool.Один означает, что на машине присутствует сигнал тревоги, а ноль означает, что все в порядке.

Извините за двойной пост.По какой-то причине моя временная учетная запись была заблокирована, и я не мог прокомментировать мой старый пост.Теперь я зарегистрирован и, надеюсь, смогу предоставить дополнительную информацию.

@ Jon Skeet, Вот установка с 2 активными портами на модуле 0B, представьте, что на модуле 0B порт 1 был активирован сигнал тревоги,тогда я все равно получу устаревшие данные, даже если проблема была решена.

http://i.stack.imgur.com/oX1ZK.jpg

Вот как это будет выглядеть на моей стороне клиента:

http://i.stack.imgur.com/stBXY.jpg

Очевидно, я хотел бы отображать только последние данные.Я надеюсь, что это устранит путаницу.


Кажется, я решил свою собственную проблему, но неэффективно.

SQLdbDataContext sqlDB = new SQLdbDataContext();

                    var LatestObjects = (from q in sqlDB.CurrentData_Tabels select q).OrderByDescending(x => x.Time).First();

                    var selectedobjects = from q in sqlDB.CurrentData_Tabels
                                          where q.Time == LatestObjects.Time
                                          select q;


                    dgvLiveData.DataSource = selectedobjects;
                    dgvLiveData.RowHeadersVisible = false;  

Объединив 2 запроса, я получил то, что хотел.Я уверен, что это можно решить с помощью одного запроса, но я далеко не хардкорный программист, который бы с этим справился.

1 Ответ

1 голос
/ 09 мая 2011

То, что вы там сделали, правильно. Вы можете написать его в одном запросе, сделав оператор для последнего запроса в качестве подзапроса в коде, но он не делает ничего другого. Когда вы устанавливаете запрос в LastQuery в своем коде, выполнение на сервере не выполняется. Фактическая выборка выполняется при использовании данных в запросе.

Пример:

  var q = dc.Mytable.Where(e=>e.id > 5);    // q is IQueryable, no fetch to db is executed yet
  q = q.Where(e=> e.name.StartWith("a"));   // q is still IQueryable and no fetch yet too
  var list = q.List();   // Fetching of data to the db happens here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...