我有一个这样的数据库表:
## Settings ##
ID (string)
Value (string)
ID是一个类似于Area.Category.SettingName的字符串。 我正在尝试基于ID构建菜单结构,所以我希望它能像这样呈现。
- Area
-- Category
--- SettingName
数据可能是这样的:
AreaOne.CategoryOne.MySetting
AreaOne.CategoryOne.MySecondSetting
AreaTwo.CategoryOne.MySetting
...
所以要做到这一点,我试图获得所有一级设置,我尝试使用此代码:
List<Settings> settings = settings.GroupBy(x => x.ID.Split('.')[0]).FirstOrDefault().ToList()
期待这个结果:
AreaOne
AreaTwo
但得到了这个结果:
AreaOne
AreaOne
AreaTwo
我做错了什么?
答案 0 :(得分:1)
如果你想要的只是第一级设置,那么正确的查询将是
var delimiter = new[] {'.'};
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList()
这会切断每行的L1设置,并使用Distinct
确保您只返回一次。除非您想获取有关每个L1设置的汇总信息,否则无需使用GroupBy
(例如,如果您希望从数据库中获取完整信息,但是在L1设置名称上分组,因为出于某种原因它很方便)。
我还使用了Split
的重载,它带有一个“限制”参数,因为你要扔掉的工作毫无意义。
最后,使用FirstIndexOf
和Substring
的组合在性能方面会更好。
答案 1 :(得分:0)
添加'.Distinct()',或重新编码以执行
var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();
答案 2 :(得分:0)
您需要从结果列表中删除重复的条目。有三个输入,因此您将获得三个输出:
以下内容应该只返回其中一个:
settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()