2010-04-03 3 views
0

나는 다음과 같은 SQL 쿼리가 있습니다LINQ 자기 참조 쿼리

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에서 이러한 쿼리를 복제하는 것 :

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 

은 다음 클래스를 사용하여? 몇 가지 변형을 시도했지만 올바른 조인 구문을 얻을 수없는 것 같습니다. 이것은 단순히 LINQ에 대해 너무 복잡한 쿼리의 경우입니까? 그것은 어떻게 중첩 된 쿼리를 사용하여 수행 할 수 있습니까?

쿼리의 목적은 가장 최근에 업데이트 된 소식을 찾는 것입니다. 즉, 게시물에 답장하면 목록의 맨 위로 이동합니다. 응답은 자체 참조하는 ParentID 열에 의해 정의됩니다. 왼쪽의 syntaxt는 LINQ에 참여

답변

-1

처럼 LINQ 지원에는 조인이 포함되지 않습니다. 복잡 한 LINQ 쿼리에 대한 경험이 부족한데도 불구하고 다음과 같은 작업을 수행했습니다.

  • 수정 된 열을 posts 테이블에 추가합니다.
  • 답장시 답장의 생성 된 열과 일치하도록 상위의 수정 된 열을 업데이트하십시오.
  • 게시 된 수정 된 열의 값을 기준으로 정렬하고 검색하십시오.

나는 코드의 한계를 감안할 때 매우 깨끗한 해결책이라고 생각합니다. 나는 다른 엔티티를 추가하거나, 뷰를 참조하거나, 특정 코드에 대해서만 스토어드 프로 시저 + 데이터 테이블 조합을 사용하는 것을 피하기를 두려워했다. 엔티티 내에 모든 것을 유지하고 NHibernate만을 사용하기를 원했고,이 수정으로 인해 최소한의 코드 냄새가 발생할 수있었습니다.

답장으로 표시하려면 여기를 남겨주세요.

+0

정말 6 개월 된 게시물, 특히 자신의 질문에 답변하는 게시물을 누가 다운볼합니까? 적어도 어리석은 일을하도록 강요당한 이유에 대한 쪽지를 남겨주세요. – Chris

0

은 다음과 같습니다

이 (내가 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")} 

뭔가 내가 NHibernate에 있다는 것을 발견

후아