2010-04-03 4 views
0

У меня есть следующий SQL-запрос:LINQ самостоятельно реферирование запрос

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, который является саморегуляцией.

ответ

-1

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

  • Добавить измененный столбец в таблицу сообщений.
  • В ответ, обновите родительский Измененный столбец в соответствии с ответом Созданный столбец
  • Сортировка и извлечение значения столбца Модифицированный для отображения сообщений.

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

Оставляя это здесь, отметьте как ответ позже.

+0

Действительно, кто уменьшает сообщение, которое составляет 6 месяцев, особенно сообщение, на которое один отвечает на свой вопрос? По крайней мере, обратите внимание на то, почему вы были вынуждены делать такую ​​глупость. – Chris

0

syntaxt левого присоединиться к 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

Смежные вопросы