来自 string[] 数组列的 Distinct() 字符串,如何使用纯 LINQ 获取它?

Distinct() strings from column of string[] array, how to get this with pure LINQ?

我找不到任何类似的例子。在我的数据库中,我有一列 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。

删除嵌套的 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();
}