0

我有一个这样的数据库表:

## 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

我究竟做错了什么?

4

3 回答 3

1

如果您想要的只是一级设置,那么正确的查询将是

var delimiter = new[] {'.'};
settings.Select(x => x.ID.Split(delimiter, 2)[0]).Distinct().ToList()

这会切断每一行的 L1 设置,并用于Distinct确保您只将它们中的每一个取回一次。GroupBy除非您想获取有关每个 L1 设置的汇总信息(例如,如果您想从数据库中获取完整信息,但由于某种原因很方便,因此按 L1 设置名称分组),否则无需使用。

我还使用了Split带有“限制”参数的重载,因为做你要扔掉的工作是没有意义的。

最后,使用 和 的组合在FirstIndexOf性能Substring方面会更好。

于 2012-05-07T11:05:43.803 回答
0

添加一个 '.Distinct()' ,或者重新编码来做

var result = settings.Select(s => x.ID.Split('.')[0]).Distinct();
于 2012-05-07T11:06:13.460 回答
0

您需要从结果列表中删除重复条目。有三个输入,因此您将获得三个输出:

像下面这样的东西应该只返回一个:

settings.Select(x => x.ID.Split('.')[0]).Distinct().ToList()
于 2012-05-07T11:06:51.930 回答