如何编写嵌套组的LINQ查询与子表达式

本文关键字:查询 表达式 LINQ 何编写 嵌套 | 更新日期: 2023-09-27 17:50:15

我有一个item对象,看起来像这样:

item["siteId"] = "{7BAD6B24-3B69-4CB9-AD02-9B0003C1927D}";
item["webId"] = "{F66ED194-A91C-49FA-8672-F87DFEE3EF08}";
item["value"] = "blah";

本例表示blah在站点{7BAD6B24-3B69-4CB9-AD02-9B0003C1927D}的web {F66ED194-A91C-49FA-8672-F87DFEE3EF08}中。

这个项目与许多其他项目在一个集合中。这个集合叫做items

我试着写一个LINQ查询,先按站点ID分组,然后按web ID,但不能得到语法正确。这是我的尝试:

var itemGroups = from item in items.Cast<SPListItem>()
     let siteId = (string) item["siteId"]
     group item by siteId
     into siteGroup
     select new
        {
            SiteId = siteId,
            SiteGroups =
                from siteItem in siteGroup
                let webId = (string) siteItem["webId"]
                group siteItem by webId into webGroup
                select new
                    {
                        WebId = webId,
                        WebGroups = from siteItem in webGroup
                    }
                };

let子句似乎不能在匿名类型中工作,我不确定在最后一个from子句中添加什么。

有人能帮忙吗?

如何编写嵌套组的LINQ查询与子表达式

不能使用在分组前声明的变量。在您的情况下,解决方案很简单。同样,你不能像那样突然地结束你的内心查询。我将把查询的结构稍微改变一下。

var itemGroups = from item in items.Cast<SPListItem>()
                    let siteId = (string) item["siteId"]
                    group item by siteId
                    into siteGroup
                    let siteGroups = from siteItem in siteGroup
                                    let webId = (string) siteItem["webId"]
                                    group siteItem by webId
                                    into webGroup
                                    select new
                                                {
                                                    WebId = webGroup.Key,
                                                    WebGroups = (from wg in webGroup select wg).ToList()
                                                }
                    select new
                            {
                                SiteId = siteGroup.Key,
                                SiteGroups = siteGroups.ToList()
                            };