2010-12-04 4 views
2

로이 쿼리를 할 수있는 방법은 어떻게 NHibernate에내가 NHibernate에

select top 10 count(distinct classedition.createdby_id) as editions, class.id, 
     class.name, class.createdon, class.createdby_id 
from class 
inner join classedition on class.id = classedition.class_id 
group by class.id, class.name, class.createdon, class.createdby_id 
order by editions desc, class.createdon desc 

내가 성공하지 않고 새의 LINQ 공급자와 그것을 시도 NHibernate에 3을 사용하고 있습니다와 함께이 쿼리를 할 수 있습니다. 위의 정확한 SQL 쿼리를 생성하는 한 그것을하는 방법에 대한 상관 없어. 가능하다면 매직 문자열없이 강력한 형식의 쿼리를 작성하는 것이 좋습니다.

나는이 질문이 간단 할 수 있도록 NHibernate를 처음 사용합니다. 여기

내가 AutoMappings과 유창함 자 NHibernate를 사용하여 좀 더 정보

입니다. C# 클래스는 매우 간단합니다.

public class Class 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual DateTime CreatedOn { get; set; } 
} 

public class ClassEdition 
{ 
    public virtual int Id { get; set; } 
    public virtual Class Class { get; set; } 
    public virtual User CreatedBy { get; set; } 
} 

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
} 

답변

1

마지막으로보기를 사용하여 문제를 해결했습니다.

나는 무례하기 싫지만, NHibernate 커뮤니티가 질문에 대답하는 방식에 대해 논쟁하는 경향이있는 것처럼 보입니다. Diego Mijelshon의 답변에 대한 의견을 참조하십시오. nhusers (Google 그룹스)에 대해 동일한 비난을 받았습니다. (Google 그룹스) : http://groups.google.com/group/nhusers/browse_thread/thread/4c74269aefb918fc

0

HQL 쿼리는 강력하게 형식화되고 개체 지향적입니다.

var results = session.CreateQuery(@" 
       select count(distinct e.CreatedBy), c.Id, 
        c.Name, c.CreatedOn, c.CreatedBy 
       from ClassEditions e 
       join e.Class c 
       group by c.Id, c.Name, c.CreatedOn, c.CreatedBy 
       order by 1 desc, c.CreatedOn desc 
       ") 
       .SetMaxResults(10) 
       .List(); 

C# 코드도 문자열입니다. 또한 NH에는 쿼리 컴파일러가 있습니다.

실제로 매핑 파일에 쿼리를 넣으면 HQL Language Service for Visual Studio을 설치하여 인텔리 센스 및 실시간 오류 검사를 수행 할 수도 있습니다.

그리고 SessionFactory를 구축하는 것 이상의 아무것도 수행하지 않는 간단한 단위 테스트는 변경으로 인해 문제가 발생했는지 여부를 알려줍니다. Resharper 같은 현대 리팩토링 툴은 문제없이 문자열, 바인딩 또는 어떤 종류의 파일에서도 식별자의 이름을 바꿀 수 있습니다.

+1

이것은 일반 구형 문자열이기 때문에 "강력하게 입력 한"의미가 아닙니다. "클래스"테이블의 이름이 바뀌면 응용 프로그램이 컴파일되지 못하게 할 수 없습니다. 그러나 나는 생각한다 (아직 시도하지 않았다) 내가 원하는 것을하고있다. 나는이 대답을 받아들이 기 전에 가능한 대안을 조금 기다릴 것이다. – W3Max

+0

도와 드릴 수 있도록 클래스와 매핑을 추가 할 수 있습니까? – Phill

+0

추가 설명보기. –