LINQ: Получить уникальные строки по выбранным идентификаторам на основе последнего времени - PullRequest
2 голосов
/ 17 февраля 2020

Мне удалось подключиться к моей базе данных, используя текущий синтаксис ниже и выполнить простой запрос LINQ. У меня есть база данных, содержащая около 20 уникальных идентификаторов SHIP_ID, которые каждые 2 минуты получают обновленную информацию о позициях для всех кораблей. Это означает, что SHIP_ID и TIMESTAMP, объединенные вместе, уникальны, и что моя база данных содержит много данных, поэтому я хочу, чтобы загрузка на сервере SQL возвращала правильные данные. И не клиент go через ответ в 20 тыс. Строк, чтобы найти желаемое значение.

Я хочу получить последнюю позицию, сохраненную в базе данных для группы выбранных кораблей, скажем, корабли с SHIP_ID 1, 2 и 3. На данный момент SHIP_ID хранятся в строке [].

            using (var scope = _scopeFactory.CreateScope())
            {
                var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
                var query = dbContext.SimpleAisRecords
                    //LINQ statements goes here to get intended result
                    .Where ?
                    .GroupBy ?
                    .Select? 
                    .OrderderByDecending ?

            }

Как я мог go пересылать правильные операторы LINQ для получения нужных мне данных? Я также хочу, чтобы у результата была вся строка, которую он выбирает как данные, например, LAT, LON, SPEED и HEADING, которые являются некоторыми из моих других столбцов.

Мне также интересно, какой формат лучше всего вернуть результат. Результатом будет возвращаемая строка, строка, в которой TIMESTAMP является самой новой для SHIP_ID, которые я хочу вызвать. Мне понадобятся все столбцы, которые есть в моей базе данных (около 15 столбцов), поскольку я буду отображать данные на карте.
Буду ли я использовать ToList? ToArray? или как-то просто сделать мой запрос результатом без изменения его после добавления.

Спасибо за ваше время (и извините за очень конкретный вопрос c, не удалось найти ни одной статьи, получающей несколько строк по выбранным идентификаторам для их последней ДАТЫ)

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

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

var lastLocations = new List<SimpleAisRecords>();
var shipIds = new string[] { "1", "2", "3" };

using (var scope = _scopeFactory.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
    foreach (var shipId in shipIds)
    {
        // Gets records for a SHIP_ID, orders by newest to oldest, and then grabs the first (newest) record
        var query = dbContext.SimpleAisRecords
                             .Where(ship => ship.SHIP_ID == shipId)
                             .OrderderByDecending(ship => ship.TIMESTAMP)
                             .FirstOrDefault();

        if (query != null)
        {
            lastLocations.Add(query);
        }
    }
}

По умолчанию он вернет все столбцы из связанной таблицы, так что вы ' у вас будет LAT, LON, SPEED, HEADING и все остальные необходимые вам столбцы.

1 голос
/ 17 февраля 2020

Я предполагаю, что ваш SHIP_ID имеет тип int? Если это так:

var ships = new string[]{ "1","2","3"};
using (var scope = _scopeFactory.CreateScope())
{
    var dbContext = scope.ServiceProvider.GetRequiredService<AisRecordContext>();
    var result = dbContext.SimpleAisRecords
        .Where(r => ships.Any(i => int.Parse(i) == r.SHIP_ID)) //Looks for any records matching any item in ships
        .OrderByDescending(r => r.TIMESTAMP); // Orders by time stamp descending...
}

После того, как вы сможете выбрать тот, который является самым последним (который будет первым, так как мы заказали по отметке времени), примерно так: var latestShip = result.FirstOrDefault();

Как Что касается того, какой тип коллекции возвращать, это зависит от того, что вам нужно сделать после ... наличие оригинальной записи даст вам гибкость, поскольку вы можете обновлять, удалять при необходимости.

...