Как написать вложенную группу по запросу LINQ с подвыражением? - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть item объект, который выглядит следующим образом:

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

Этот пример показывает, что значение blah находится в сети {F66ED194-A91C-49FA-8672-F87DFEE3EF08}, которая находится на сайте {7BAD6B24-3B69-4CB9-AD02-9B0003C1927D}.

Этот предмет находится в коллекции вместе со многими другими.Коллекция называется items.

Я пытался написать запрос LINQ, который группируется сначала по идентификатору сайта, а затем по идентификатору сети, но не может получить правильный синтаксис.Вот моя попытка:

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.

Может кто-нибудьпожалуйста, помогите?

1 Ответ

2 голосов
/ 13 апреля 2011

Вы не можете использовать переменные, которые вы объявили перед группировкой.В вашем случае решение простое.Кроме того, вы не можете внезапно завершить свой внутренний запрос таким образом.И я бы структурировал запрос немного по-другому.

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()
                            };
...