Конкатенация строк на основе сравнения строк с использованием LINQ - PullRequest
0 голосов
/ 10 января 2019

Я пытался делать это в SQL около месяца, но, думаю, было бы проще сделать это с .NET linq.

Основы следующие:

Предполагается, что запрос возвращает данные из диапазона дат и возвращает объединенный список имен игроков и времени игроков.

Объединение произошло бы ТОЛЬКО, если бы playEnd было в течение 30 минут после следующих игроков playStart.

Итак, если у меня есть такие данные:

Name        PlayDate         PlayStart      PlayEnd
----------------------------------------------------
player1 |   10/8/2018    |   08:00:00   |   09:00:00
player2 |   10/8/2018    |   09:10:00   |   10:10:00
player3 |   10/9/2018    |   10:40:00   |   11:30:00
player4 |   10/11/2018   |   08:30:00   |   08:37:00
player5 |   10/11/2018   |   08:40:00   |   08:50:00  
player6 |   10/12/2018   |   09:00:00   |   09:45:00
player7 |   10/12/2018   |   09:50:00   |   10:10:00
player8 |   10/12/2018   |   10:30:00   |   12:20:00
  • player1 и player2 время воспроизведения будут объединены, например: player1, player2 = 8:00:00 - 10:10:00 for 10/8/2018

  • player3 будет просто: player3 = 10:40:00 - 11:30:00 for 10/9/2018

  • player4 и player5 время воспроизведения будет объединено как: player4, player5 = 08:30:00 - 08:50:00 for 10/11/2018
  • player6 и player7 и player8 время воспроизведения будут объединяться следующим образом: player6, player7, player8 = 09:00:00 - 12:20:00 for 10/12/2018

Я пытался изменить приведенный ниже запрос разными способами, но я просто не знаю, как сравнить одну строку данных со следующей, а затем объединить две (или более) при необходимости.

        var query = from pl in players
                            select new PlaySession
                            {
                                Name = pl.Name,
                                PlayDate = pl.PlayDate,
                                PlayStart = pl.PlayStartTime,
                                PlayEnd = pl.PlayEndTime
                            };

            var grouped = query
                        .OrderBy(r => r.Name)
                        .ThenBy(r => r.PlayDate)
                        .ThenBy(r => r.PlayStart)

Теперь я запутался:

Мне нужно выяснить следующее:

  • как сравнить PlayDates различных строк, чтобы убедиться, что они имеют одинаковую дату, например: row1.PlayDate == row2.PlayDate

  • как сравнить одну строку PlayEnd со следующими строками PlayStart, примерно так: row2.PlayStart - row1.PlayEnd < 30 minutes

Есть ли способ сравнить значения по строкам с помощью LINQ?

Спасибо!

1 Ответ

0 голосов
/ 10 января 2019

Что касается меня, то все должно быть так:

List<ViewModel> playersGroupList =  Players.GroupBy(p => p.PlayDate).Select(group => new ViewModel
                {
                    PlayDate = group.Key,
                    Names = String.Join("-", group.Select(g => g.Name).ToArray()),
                    PlayDuration = group.Select(g => g.PlayStart).First() + "-" + group.Select(g => g.PlayEnd).Last()
                }).ToList();

А здесь ViewModel выглядит следующим образом:

public class ViewModel
{
   public string PlayDate {get set;}
   public string Names {get set;}
   public string PlayDuration {get set;}
}

Примечание: может потребоваться некоторое решение для выполнения вашего требования «точка-точка», но фактическая реализация должна быть такой, как показано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...