Кортеж должен содержать и не содержать список C# - PullRequest
0 голосов
/ 21 апреля 2020

У меня такой запрос:

var foundData = await DatabaseContext.Set<TableA>()
                .AsNoTracking()
                .Where(x => list.Contains(x.Code))
                .Select(x => x.Code)
                .ToListAsync()
                .ConfigureAwait(false);

var notFoundData = await DatabaseContext.Set<TableA>()
                .AsNoTracking()
                .Where(x => !list.Contains(x.Code))
                .Select(x => x.Code)
                .ToListAsync()
                .ConfigureAwait(false);

Поскольку этот запрос дважды попадает в базу данных, а также я не хочу получать все записи из базы данных и затем фильтровать. Возможно ли иметь List<tuple>, который делает это в одном запросе, как

Предположим, база данных содержит:

A,B,C,D,E

В действительности база данных содержит миллионы записей. Так же как и список.

и список содержит A, B, F

Таким образом, найденный список будет содержать: A, B

И notFound будет содержать: F

Таким образом, ожидаемый результат будет var (found, notfound) =?

Ответы [ 2 ]

0 голосов
/ 22 апреля 2020

Вы можете сделать что-то следующим образом:

List<string> records = new List<string> {"A", "B", "C", "D", "E"};
List<string> list = new List<string> {"A", "B", "F"};

var result = records
    .GroupBy(r => list.Contains(r))
    .ToDictionary(r => r.Key);

var (found, notfound) = (result.ContainsKey(true) ? result[true].Select(g => g) : new List<string>(), 
                         result.ContainsKey(false) ? result[false].Select(g => g) : new List<string>());

0 голосов
/ 21 апреля 2020

Вам это помогает?

var source = new List<string> { "A", "B", "C", "D", "E" };
var target = new List<string> { "A", "B", "F" };

var foundOrNot = target.Select(s => new { Value = s, Found = source.Contains(s) });

foreach(var entry in foundOrNot)
{
    Console.WriteLine("Value: " + entry.Value + "; Found: " + entry.Found.ToString());
}

https://dotnetfiddle.net/KL9yfK

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