Генерация строки из группировки Linq Query - PullRequest
2 голосов
/ 06 января 2009

С учетом следующего кода:

var people = new List<person>(){ new person { Name = "John", FamilyName = "Pendray" },
             new person { FamilyName = "Emery", Name = "Jake"},
             new person { FamilyName = "Pendray", Name = "Richard" } };

var q = from p in people
                 orderby p.Name
                 group p by p.FamilyName into fam
                 orderby fam.Key
                 select new { fam.Key, members = from p in fam select p };

Можно ли заменить последнюю строку с помощью выбора, который выведет IEnumerable <string>, который содержит эти две строки: "Пендрей Джон Ричард" "Эмери Джейк"? Можно ли спроецировать запрос linq на такие строки?

Редактировать: я знаю, что это возможно с помощью дополнительного кода, но меня интересует, можно ли это сделать из самого запроса linq аналогично тому, как VB может проецировать XML из запроса, как в http://www.thinqlinq.com/default/Projecting-XML-from-LINQ-to-SQL.aspx (особенно последний кодовый блок на этой странице)

Ответы [ 2 ]

4 голосов
/ 06 января 2009
var q = from p in people
        orderby p.Name
        group p by p.FamilyName into fam
        orderby fam.Key
        select fam.Key + " " + string.Join(" ", (from fm in fam select fm.Name).ToArray());

Возвращает

Emery Jake
Pendray John Richard

0 голосов
/ 06 января 2009

Определенно.

Вам придется изменить выбранную часть. Самый простой способ - определить функцию, которая будет принимать IEnumerable и генерировать эту строку, а затем вызвать эту функцию

people = new List<person>(){ new person { Name = "John", FamilyName = "Pendray" },
         new person { FamilyName = "Emery", Name = "Jake"},
         new person { FamilyName = "Pendray", Name = "Richard" } };

var q = from p in people
        orderby p.Name
        group p by p.FamilyName into fam
        orderby fam.Key
        select new { Key = fam.Key, Text = GetText(fam) };



// and elsewhere...
private string GetText(IEnumerable<person> family) {
    string result = "Whatever"; // build the result string here
    return result;
}

Кроме того, если вам нужен только текст, вы можете изменить последнюю строку запроса на

        select GetText(fam);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...