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