объединение в linq join для равных - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь объединить два объекта в linq, как показано ниже:

var clients = from cts in ctList
              join pc in personList on ct.name equals pc.name
              select new 
              {
                ip = pc.Ip,
                clts = cts
              };

Фактический результат: Я получаю клиентов без результата, когда personList имеет значение null.

Ожидается: Когда personList имеет значение null, мы по-прежнему должны получать результат клиентов, но назначаем ip как '-', когда нет результата в personList.

Я хочу добиться, как показано ниже, но он не работает:

join pc in personList on ct.name equals pc?.name ?? ct.name

Буду очень признателен за помощь. Спасибо!

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

При использовании левого соединения запрос будет:

var clients = from cts in ctList
              join pc in personList on cts.name equals pc.name into lefedResults
              from lefedResult in lefedResults.DefaultIfEmpty()
              select new 
              {
                ip = lefedResult?.Ip ?? "-",
                clts = cts
              };

Надеюсь, вы найдете это полезным.

1 голос
/ 10 июля 2020

Найдите ниже пример с незначительными изменениями для повышения надежности, предполагая, что список ввода нельзя очистить:

Более подробная информация доступна на https://docs.microsoft.com/en-us/dotnet/csharp/linq/perform-left-outer-joins.

--- Вывод (консольное приложение) ---

John -> 10.0.0.5
Sally -> 10.0.0.7
Sally -> 10.0.0.9
Sally -> -
<Unknown User> -> 10.1.1.100
<Unknown User> -> -
<Unknown User> -> -

--- Классы ---

class Person
{
    public string Name { get; set; }
}

class Client
{
    public string OwnerName { get; set; }

    public string Ip { get; set; }
}

- - Запрос LINQ ---

        List<Person> people = new List<Person>{
            new Person { Name = "John" },
            new Person { Name = "Mary" },
            new Person { Name = "Sally" },
            new Person { Name = null },
            null
        };

        List<Client> machines = new List<Client>{
            new Client { OwnerName = "John", Ip = "10.0.0.5" },
            new Client { OwnerName = "Sally", Ip = "10.0.0.7" },
            new Client { OwnerName = "Sally", Ip = "10.0.0.9" },
            new Client { OwnerName = "Sally", Ip = null }, // Sally -> -
            new Client { OwnerName = null, Ip = "10.1.1.100" }, // <Unknown User> -> 10.1.1.100
            new Client { OwnerName = null, Ip = null }, // <Unknown User> -> -
            null // <Unknown User> -> -
        };

        if (people != null && machines != null)
        {
            var query = from machine in machines
                        join person in people on machine?.OwnerName equals person?.Name into gj
                        select new { Name = machine?.OwnerName?? "<Unknown User>", Ip = machine?.Ip ?? "-" };

            foreach (var result in query)
            {
                Console.WriteLine($"{result.Name} -> {result.Ip}");
            }
        }
1 голос
/ 10 июля 2020

Решение 1:

var clients = from cts in ctList
    from pc in personList.Where(x => x.name == cts.name).DefaultIfEmpty()
    select new
    {
        ip = pc?.Ip ?? "-",
        clts = cts
    };

Решение 2:

var clients = from cts in ctList
              select new
              {
                  ip = personList.Where(x => x.name == cts.name).Select(x => x.Ip).FirstOrDefault() ?? "-",
                  clts = cts
              };

Решение 3:

var clients = ctList.Select(cts => new
{
    clts = cts,
    ip = personList.Where(x => x.name == cts.name).Select(x => x.Ip).DefaultIfEmpty("-").First()
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...