我希望我能正確理解你的問題,所以你只想讓所有的作者至少有一張紙,這個標誌設置爲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);
}
}
創建和查詢
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();
}
它實際上返回我到底那些作者......你可以處理這進一步有隻是一個不同的結果...
:編輯開始: 查詢所有的作者與標誌的最大值,它成爲一個有點棘手使用LINQ,下面的LINQ查詢將返回結果:
var authorsWithPublications = session.Query<Paper>()
.GroupBy(p => new { Author = p.Author })
.Select(p => new {
Author = p.Key,
HasPublished = p.Max(c=> c.HasPublished)
})
.ToList();
但如果c.HasPublished是SqlServer的一個位字段,它會給你的SQL異常最大值是不允許位字段。
試圖將布爾轉換爲int wihtin LINQ的聲明像
...HasPublished = p.Max(c => c.HasPublished == true ? 1 : 0)
會拋出異常Code supposed to be unreachable
,因爲它不是由NHibernate的支持...
我發現拿到第一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