LINQ самообращающийся запрос - PullRequest
0 голосов
/ 03 апреля 2010

У меня следующий запрос SQL:

select
    p1.[id], 
    p1.[useraccountid], 
    p1.[subject], 
    p1.[message], 
    p1.[views], 
    p1.[parentid], 
    max(
        case
            when p2.[created] is null then p1.[created]
            else p2.[created]
        end
    ) as LastUpdate
from forumposts p1
    left join 
    (
        select 
            id, parentid, created
        from
            forumposts 
    ) p2 on p2.parentid = p1.id 
where 
    p1.[parentid] is null
group by 
    p1.[id], 
    p1.[useraccountid], 
    p1.[subject], 
    p1.[message], 
    p1.[views], 
    p1.[parentid]
order by LastUpdate desc

Используя следующий класс:

public class ForumPost : PersistedObject
{
    public int Views { get; set; }
    public string Message { get; set; }
    public string Subject { get; set; }        
    public ForumPost Parent { get; set; }
    public UserAccount UserAccount { get; set; }
    public IList<ForumPost> Replies { get; set; }
}

Как бы я повторил такой запрос в LINQ? Я пробовал несколько вариантов, но я не могу получить правильный синтаксис соединения. Это просто случай запроса, который слишком сложен для LINQ? Можно ли это сделать с помощью вложенных запросов, как?

Цель запроса - найти последние обновленные сообщения, то есть ответ на сообщение увеличит его до верхней части списка. Ответы определяются столбцом ParentID, который ссылается на себя.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2010

Я обнаружил, что поддержка NHibernate LINQ не включает объединения. В связи с очевидной неопытностью со сложными запросами LINQ я прибег к следующей работе:

  • Добавить измененный столбец в таблицу сообщений.
  • В ответе обновите столбец Modified родительского элемента, чтобы он соответствовал столбцу Created ответа
  • Сортировка и получение значения измененного столбца для последующего отображения.

Я думаю, что это довольно чистая работа, учитывая ограничения кода. Я ужасно хотел избежать необходимости прибегать к добавлению другой сущности, обращению к представлению или использованию комбинации хранимой процедуры + таблицы данных только для этого конкретного фрагмента кода. Хотелось сохранить все внутри сущностей и использовать только NHibernate, и это исправление позволяет это делать с минимальным запахом кода.

Оставьте это здесь, чтобы пометить как ответ позже.

0 голосов
/ 04 апреля 2010

Синтаксис левого соединения в LINQ:

(я положил это в VB.NET):

Dim query = From table1 in myTable.AsEnumarable 'Can be a collection of your object
            Group join table2 in MyOtherTable.AsEnumerable 
            On table1.Field(Of Type)("myfield") Equals table2.Field(Of Type)("myfield")
            In temp
            From table2 in temp.DefaultIsEmpty()
            Where table1.Field(Of Type)("Myanotherfield") is Nothing 'exemple
            Select New With { .firstField = table1.Field(Of Type)("Myanotherfield")
                              .secondField = table2.Field(Of Type)("Myanotherfield2")}

Нечто подобное

Ju

...