Distinct () строки из столбца массива string [], как получить это с чистым LINQ? - PullRequest
0 голосов
/ 23 января 2020

Я не смог найти подобного примера. В моей БД у меня есть столбец массива string[], где они разделены запятой. Пример из 3 строк:

id1: apple, orange, banana, kiwi
id2: orange, kiwi
id3: lemon, pineaple, kiwi

Из этого списка мне нужно извлечь с помощью LINQ Список отдельных строк: apple, orange, banana, kiwi, lemon, pineapple.

Мне удалось это сделать , но не чисто LINQ , но при использовании также foreach:

public async Task<List<string>> GetFruitDetailedType()
        {
            List<string> all = new List<string>();
            var qry = await GetFruitsQueryable().Select(v => v.DetailedType).ToListAsync();
            foreach (var item in qry)
            {
                foreach(var type in item)
                {
                    all.Add(type);
                }
            }
            return (from w in all select w).Distinct().ToList();
        }

Есть ли способ сделать это только с помощью LINQ , без вызова объекта со всеми сущностями?

ПРИМЕЧАНИЕ: используется EF Core 2.

1 Ответ

2 голосов
/ 23 января 2020

Удаление вложенных циклов for довольно просто, так как вы просто делаете плоское отображение коллекции коллекций. Требуемое для этого расширение LINQ: SelectMany . Используя его, вы можете уменьшить свою функцию до чего-то вроде этого:

public async Task<List<string>> GetFruitDetailedType() 
{
    var qry = await GetFruitsQueryable().Select(v => v.DetailedType).ToListAsync();
    return qry.SelectMany(x => x).Distinct().ToList();
}

Я не проверял следующее, но я также подозреваю, что это может также работать:

public async Task<List<string>> GetFruitDetailedType()
{
    return await GetFruitsQueryable().SelectMany(x => x.DetailedType)
                                     .Distinct()
                                     .ToListAsync();
}
...