Учитывая следующий код:
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 (особенно последний код заблокировать на этой странице)





Определенно.
Вам придется изменить выбранную часть. Самый простой способ - определить функцию, которая будет принимать 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);
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 JakePendray John Richard