문제

public class SearchText
{
    public virtual int Id { get; set; }
    public virtual string Text { get; set; }
}

public class SearchTextLog
{
    public virtual int Id { get; set; }
    public virtual SearchText SearchText { get; set; }
    public virtual User User { get; set; }
    public virtual int SearchCount { get; set; }
    public virtual DateTime LastSearchDate { get; set; }
}
.

SearchTextLog 내의 카운트의 합계에 따라 상위 5 개의 SearchText 항목을 선택하려고합니다. 현재 상위 5 개 항목을 얻으려면 먼저 쿼리를 수행 한 다음 두 번째 쿼리 내에서 결과를 사용 하여이 문제를 해결할 수있었습니다. 나는 누군가가 빛을 보여 주고이 두 개의 별도의 쿼리를 하나의 단위로 통합 할 수있는 방법을 가르쳐 지는지 궁금해하고있었습니다.

여기에있는 것입니다 :

var topSearchCriteria = Session.CreateCriteria(typeof (SearchTextLog))
            .SetProjection(Projections.ProjectionList()
                            .Add(Projections.GroupProperty("SearchText.Id"))
                            .Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
            .AddOrder(Order.Desc("SearchCount"))
            .SetMaxResults(topSearchLimit)
            .List<int>();

return Session.CreateCriteria<SearchText>()
            .Add(Restrictions.In("Id", topSearchCriteria.ToArray()))
            .List<SearchText>();
.

편집 :

오, 아니, 나는 내 현재의 해결책이 중요한 순서로 중요한 순서를 잃을 것이라는 것을 깨달았습니다. 그래서 나는 쿼리를 확실히 통합해야합니다. : - /

편집 :

나는이 양방향 매핑을 시도했지만, 다음 명령문을 허용하기 위해서는, SearchText 항목을 반환 할 수 없다. SearchText 속성이 그룹화가 아니라는 것을 불평합니다.

return Session.CreateCriteria<SearchText>()
                .CreateAlias("SearchTextLogs", "stl")
                .AddOrder(Order.Desc(Projections.Sum("stl.SearchCount")))
                .SetMaxResults(topSearchLimit)        
                .SetResultTransformer(Transformers.AliasToEntityMap)
                .List<SearchText>();
.

내 무지를 변명하지만, 니시 흔들은 나에게 완전히 새로운 것이며 완전히 다른 사고 방식이 필요합니다.

도움이 되었습니까?

해결책

OK, 저는 해결책을 알아 냈습니다.

내 질문에 따라 내 원래 솔루션은 Nhibernate가 SELECT 절에 추가하지 않고 속성별로 그룹을 수행 할 수있는 기능을 지원하지 않기 때문에 내 원래 솔루션이 작동하지 않습니다 ( 링크 텍스트 ).

그러나 어리석은 것처럼, 나는 이러한 멋진 것들을 resulttransformers라는 것으로 나타났습니다. Aliastobean 결과 변압기를 사용하면 Nhibernate는 내가 지정한 유형의 형식 내에서 동일한 이름의 속성에 각 프로젝션 항목에 각각의 투영 항목에 제공하는 별명을 자동으로 매핑합니다. 단순히 My SearchText 객체를 지정했습니다 (그러나 Sum Projection Item에 대한 totalsearchCount 속성을 추가해야 함). 그것은 내 물건을 완벽하게 채웠고 그들을 반환했습니다.

return Session.CreateCriteria(typeof(SearchTextLog))
            .CreateAlias("SearchText", "st")
            .SetProjection(Projections.ProjectionList()
                                .Add(Projections.Alias(Projections.GroupProperty("st.Id"), "Id"))
                                .Add(Projections.Alias(Projections.GroupProperty("st.Text"), "Text"))
                                .Add(Projections.Alias(Projections.Sum("SearchCount"), "TotalSearchCount")))
            .SetMaxResults(topSearchLimit)
            .AddOrder(Order.Desc("TotalSearchCount"))
            .SetResultTransformer(Transformers.AliasToBean(typeof(SearchText)))
            .List<SearchText>();
.

나는 이것이 쉽게하기가 더 쉽지 않다는 것을 놀라게했다. 이것은 이것을 알아내는 것에 대해 약 4 ~ 5 시간의 연구와 개발을 가져갔습니다. 잘하면 내 닌자의 경험이 점점 더 많은 경험으로 쉽게 얻을 수 있습니다.

이것은 다른 누군가가 밖에서 도움이되기를 바랍니다!

다른 팁

이 작동하지 않습니까?

var critterRes = Session.CreateCriteria(typeof (SearchTextLog))
            .SetProjection(Projections.ProjectionList()
                            .Add(Projections.GroupProperty("SearchText"))
                            .Add(Projections.Property("SearchText"))
                            .Add(Projections.Alias(Projections.Sum("SearchCount"), "SearchCount")))
            .AddOrder(Order.Desc("SearchCount"))
            .SetMaxResults(topSearchLimit)
            .List<SearchText>()
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top