Вопрос

Я пытаюсь запустить запрос 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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top