Linq to SQL группирует дочерние отношения
-
02-07-2019 - |
Вопрос
Я пытаюсь запустить запрос LINQ to SQL, который возвращает результат в виде сетки в списке стилей поисковой системы.
В приведенном ниже упрощенном примере можно ли заполнить коллекцию разделенным запятыми списком всех дочерних элементов, которые есть у родителя (NAMESOFCHILDREN), в одном запросе?
var family = from p in db.Parents
where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"])
join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId
join c in db.Children on pcl.ChildId equals c.ChildId
select new
{
Family = "Name: " + p.ParentName + "<br />" +
"Children: " + NAMESOFCHILDREN? + "<br />"
};
Заранее спасибо.
Решение
Ваши объединения испортят вашу мощность!У вас нет списка родителей!
Вот непроверенный код, написанный от руки.Добавление отношений в конструкторе Linq дает вам свойства отношений.String.Join объединит список.
Я добавил два дополнительных вызова метода.
Где ...Любой будет фильтровать родителей только для тех родителей, у которых есть дети.Я не уверен в поведении string.Join в пустом массиве.
К списку выдернет родителей в память, доступ к детям будет осуществляться при дальнейших вызовах базы данных.Это может быть необходимо, если вы получаете среду выполнения string.Join не поддерживается переводчиком SQL исключение.Это исключение будет означать, что LINQ попытался преобразовать вызов метода во что-то, что может понять SQL Server, — и потерпел неудачу.
int parentID = Convert.ToInt32(Request.QueryString["parentId"]);
List<string> result =
db.Parents
.Where(p => p.ParentId == parentID)
//.Where(p => p.ParentChildLookup.Children.Any())
//.ToList()
.Select(p =>
"Name: " + p.ParentName + "<br />" +
"Children: " + String.Join(", ", p.ParentChildLookup.Children.Select(c => c.Name).ToArray() + "<br />"
)).ToList();
Также обратите внимание:обычно не следует смешивать данные и разметку до тех пор, пока данные не будут правильно экранированы для разметки.
Другие советы
вы можете попробовать следующее:
var family = from p in db.Parents
where p.ParentId == Convert.ToInt32(Request.QueryString["parentId"])
join pcl in db.ParentChildLookup on p.ParentId equals pcl.ParentId
select new {
Family = "Name: " + p.ParentName + "<br />" + string.Join(",",(from c in db.Children where c.ChildId equals pcl.ChildId select c.ChildId.ToString()).ToArray());
};
Публикация ответа на старый вопрос с groupby
.Приведенный ниже запрос выдаст название компании, количество заказов и идентификаторы заказов, разделенные запятой, из Northwind.
var query = from c in north.Customers
join o in north.Orders on c.CustomerID equals o.CustomerID
select new { c, o };
var query2 = from q in query
group q.o by q.c into g
select new { CompanyName = g.Key.CompanyName,
orderCount = g.Count(),
orders = string.Join(",", g.Select(o => o.OrderID)) }
into result
orderby result.orderCount descending
select result;