Я довольно новичок в 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 запроса, я получил то, что хотел.Я уверен, что это можно решить с помощью одного запроса, но я далеко не хардкорный программист, который бы с этим справился.