LINQ - Выберите Макс из двух значений, если число> 1 - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть LINQ, который возвращает некоторые данные.Он состоит из двух свойств ChannelType и ChannelName.Иногда тип канала будет нулевым, а его число - только 1, поскольку канал еще не установлен.

Запрос LINQ:

var channels = (from channel in db.UriData
                join device in db.Devices on channel.SerialNumber equals device.SerialNumber
                join active in db.ActiveChannels on channel.ChannelName equals active.ChannelName
                where channel.ChannelName.Contains(active.ChannelName) && 
                device.Active &&
                channel.SerialNumber == serial
                select new { channel.ChannelName, channel.ChannelType }).Distinct().ToList().OrderByDescending(x => x.ChannelName);           

Данные, возвращаемые из LINQquery:

{ ChannelName = "v1", ChannelType = null }
{ ChannelName = "v1", ChannelType = "Electricity" }
{ ChannelName = "v2", ChannelType = null }
{ ChannelName = "v2", ChannelType = "Electricity" }
{ ChannelName = "v3", ChannelType = null }
{ ChannelName = "v3", ChannelType = "Electricity" }
{ ChannelName = "v4", ChannelType = null }

Из данных вы увидите, что есть два значения для ChannelName, одно является нулевым, а другое - нет.Я хочу иметь возможность выбрать значение Max(), поэтому я могу игнорировать ноль, когда есть два имени канала.Max() будет иметь дело с одиночным ChannelName, которое является нулевым, как показано в первой записи данных.

Как выбрать Max() и удалить пустые значения, если существует более одного ChannelName.Например, если мы используем ChannelName v1, как показано в данных, мы можем видеть, что есть два v1.Я хочу получить Max () и игнорировать / удалить нулевое значение, если существует более одного v1.

Я предполагаю, что могу сделать это с помощью другого LINQ запроса, такого как:

var c = channels.Select(x => new { x.ChannelName, x.ChannelType }).Max();

Ожидаемый результат:

{ ChannelName = "v1", ChannelType = "Electricity" }
{ ChannelName = "v2", ChannelType = "Electricity" }
{ ChannelName = "v3", ChannelType = "Electricity" }
{ ChannelName = "v4", ChannelType = null }

TIA

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019
var _channels = new List<(string, string)>();

foreach(var c in channels)
{
    var channeltypes = channels.Where(x => x.ChannelName == c.ChannelName && x.ChannelType != null);
    if(channeltypes.Any())
    {
        _channels.Add((channeltypes[0].ChannelName, channeltypes[0].ChannelType));
    } else {
        _channels.Add((c.ChannelName, null));
    }
}
0 голосов
/ 16 февраля 2019

Один из способов сделать это - использовать GroupBy.Обычно вы группируете все каналы по имени (ключу), а затем сортируете все значения, чтобы получить первое значение, соответствующее вашим критериям:

var result = channels
    .GroupBy(i => i.ChannelName)
    .Select(i => new 
    { 
        ChannelName = i.Key, 
        ChannelType = i.OrderByDescending(v => v.ChannelType)
                       .First()
                       .ChannelType
    });
0 голосов
/ 16 февраля 2019

Попробуйте следующее:

            var results = channels.Where(x => x.ChannelType != null)
                .Select(x => new { index = int.Parse(x.ChannelName.Replace("v", "")), channel = x })
                .GroupBy(x => x.channel.ChannelType)
                .Select(x => x.OrderByDescending(y => y.index))
                .Select(x => x.FirstOrDefault().channel)
                .ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...