이 문제를 올바르게 이해했기 때문에이 플래그가 true로 설정된 용지가 하나 이상있는 모든 작성자를 얻고 싶습니다.
왜 Linq를 쓰는 것이 더 쉬운지, 그런 간단한 시나리오에서 작동해야하는 이유는 무엇입니까? 나는 또한 부울에 깃발을지도 것, 그래서 전혀 Max
작업을 할 필요 ... 예이없는 것 같아요 :
var authorsWithPublications = session.Query<Paper>()
.Select(p => new { Author = p.Author, HasPublished = p.HasPublished })
.Where(p => p.HasPublished == true).ToList();
내가이 간단한 시나리오를 사용, 나를이 아무튼 알고하자
법인 + 매핑 : : 't는 당신의 문제에 맞는 테스트 데이터의
public class Paper
{
public virtual int Id { get; set; }
public virtual string Author { get; set; }
public virtual bool HasPublished { get; set; }
public virtual string Description { get; set; }
public virtual string Something { get; set; }
public virtual string SomethingElse { get; set; }
}
public class PaperMap : ClassMap<Paper>
{
public PaperMap()
{
Id<int>("Id");
Map(p => p.Author);
Map(p => p.HasPublished);
Map(p => p.Description);
Map(p => p.Something);
Map(p => p.SomethingElse);
}
}
생성하고 쿼리를
,363,210
using (var session = sessionFactory.OpenSession())
{
Random r1 = new Random();
for (int i = 0; i < 100; i++)
{
session.Save(new Paper()
{
Author = "Author" + i,
HasPublished = r1.Next(0, 2) == 0 ? false : true,
Description = "Description" +i,
Something = "Something" + i,
SomethingElse = "something else" + i
});
}
session.Flush();
var authorsWithPublications = session.Query<Paper>()
.Select(p => new { Author = p.Author, HasPublished = p.HasPublished })
.Where(p => p.HasPublished == true).ToList();
}
그것은 실제로 정확히 그 저자는 ... 당신이 더 그냥 별개의 결과를 가지고 처리 할 수있는 날을 반환 ...
: 편집 시작 : 이 플래그의 최대 값과 모든 저자를 조회 최대가 아니라고 c.HasPublished는 SQLSERVER에서 비트 필드 인 경우
var authorsWithPublications = session.Query<Paper>()
.GroupBy(p => new { Author = p.Author })
.Select(p => new {
Author = p.Key,
HasPublished = p.Max(c=> c.HasPublished)
})
.ToList();
그러나 , 그것은 당신에게 SQL 예외를 줄 것이다 : 그것은 LINQ와 약간 까다로운되고, 다음 LINQ 쿼리는 결과를 반환 비트 필드에서 허용됩니다. 이 nHibernate 수에 의해 지원되지 않기 때문에
는 예외
Code supposed to be unreachable
가 발생합니다
...HasPublished = p.Max(c => c.HasPublished == true ? 1 : 0)
같은 LINQ 문 고급형 아파트 int로하는 부울로 변환하는 중 ...
내가 처음 LINQ 쿼리 실행을 얻을 발견하는 유일한 방법은 매핑 내에 수식을 지정하는 것입니다 :
Map(p => p.HasPublished).Formula("cast (HasPublished as int)");
이제이 공식은 모든 SELECT 문에 적용됩니다, 문은 다음과 같이 표시됩니다
select paper0_.Author as col_0_0_, max(cast (paper0_.HasPublished as int)) as col_1_0_
from [Paper] paper0_
group by paper0_.Author
은 어쨌든 당신은 이미 해결책을 발견하고 다음 실제로 공식
의 필요없이 같은 일
var criteria = session.CreateCriteria<Paper>();
criteria.SetProjection(
Projections.Group<Paper>(p=>p.Author),
Projections.Max(
Projections.Cast(NHibernateUtil.Int32, Projections.Property("HasPublished")))
);
var result = criteria.List();
아마도 우리 둘 다 뭔가를 배웠습니다.)
즉각적인 문제에 대한 해결책을 찾았습니다. 'Projections.Max'는 여러 번 과부하가 걸립니다. 하나의 과부하는 단순히 또 다른 투영을 할 수 있습니다.이 경우 'Projections.Cast'. 'Projections.Max ( Projections.Cast (NHibernateUtil.Int32, Projections.Property ("major_journal")) .WithAlias (() => report.EverPublished)' 내 원래 : 그래서 필요한 라인이 될 수 있습니다 시도가 불필요하게 복잡한 버전의 'Projections.Max'를 사용하고있었습니다. – phil