Linq to SQL Группировка дочерних отношений - PullRequest
2 голосов
/ 22 сентября 2008

Я пытаюсь запустить запрос 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 />"
             };

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 22 сентября 2008

Ваши объединения собираются испортить вашу мощность! У вас нет списка родителей!

Вот некоторый непроверенный код свободной руки. Добавление отношений в дизайнере Linq дает вам свойства отношений. String.Join соберет список вместе.

Я добавил два необязательных вызова метода.

Где ... Любой будет фильтровать родителей только по тем родителям, у которых есть дети. Я не уверен в строке. Поведение Джоина на пустом массиве.

ToList возвращает родителей в память, к детям будут обращаться дальнейшие обращения к базе данных. Это может быть необходимо, если вы получаете строку времени выполнения. 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();

Также обратите внимание: как правило, вы не хотите смешивать данные и разметку, пока данные не будут должным образом экранированы для разметки.

0 голосов
/ 08 мая 2015

Отправка ответа на старый вопрос с 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;
0 голосов
/ 22 сентября 2008

вы можете попробовать следующим образом:

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());
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...