Использование Linq2SQL для возврата данных родительской таблицы, но сортировка по данным дочерней таблицы - PullRequest
1 голос
/ 01 октября 2010

У меня есть отношение Parent / Child Table с ChildTable, связывающим обратно с ParentTable через внешний ключ ParentId. В ChildTable есть несколько записей для каждой записи ParentTable. Для тех, кто пользуется, вам нравятся элементарные визуальные эффекты, вот диаграмма.

ParentTable
------------
+Id
Date

ChildTable
------------
+Id
ParentId
Date

То, что я пытаюсь сделать, это возвращать только ОДНУ запись для каждого элемента ParentTable, который присоединяется к последнему значению даты ChildTable (обратите внимание, а не к значению Date родительского элемента). Результаты будут выглядеть так:

ParentTable::Id ParentTable::Foo ChildTable:Id ChildData::Foo ChildData::Date
--------------- ---------------- ------------- -------------- ---------------
55              Other Values     700           Other values   12/1/2010      
1               "                1000          "              11/30/2010
10              "                214           "              10/31/2010

Важно, чтобы ChildData :: Date сортировалась по убыванию.

Кажется, это должно быть просто, но я борюсь с его аспектами LinQ2SQL. Я все еще жду своего "ах-ха" момента, когда я смогу думать в Линке.

Вот окончательный ответ, спасибо Уинстону:

var results = 
    from p in parent
    join c in (from c2 in child orderby c2.Date descending select c2)
    on p.Id equals c.ParentId into childGroup
    select new { ParentId=p.Id, ParentDate=p.Date, ChildDate=childGroup.First().Date } into NewResult
    orderby NewResult.Activity descending
    select NewResult

Ответы [ 2 ]

1 голос
/ 01 октября 2010

Следующее должно работать, я проверил его на некоторых фиктивных данных.

var results = 
    from p in parent
    join c in (from c2 in child orderby c2.Date descending select c2)
    on p.Id equals c.ParentId into childGroup
    select new { ParentId=p.Id, ParentDate=p.Date, ChildDate=childGroup.First().Date };

Обновлено, чтобы выбрать только необходимые поля.

0 голосов
/ 01 октября 2010

Попробуйте что-то вроде

var x = ParentTable.Select(z=> new {
z.Id,
z.Foo,
z.ParentIDChildTable.OrderBy(c=> c.Date).First().ID,
z.ParentIDChildTable.OrderBy(c=> c.Date).First().Foo,
z.ParentIDChildTable.OrderBy(c=> c.Date).First().Date

}

Возможно, есть лучший способ заказать таблицу Child перед выбором, но я не могу думать об этом ... Также внешний ключ может быть не таким, как напечатано выше, ноintellisense должен помочь вам там.

...