NHibernate使用第一个查询中的值

NHibernate使用第一个查询中的值,nhibernate,Nhibernate,所以,我有一个类似的问题 public static IEnumerable<Archive> GetArchivesRecursive(this ISession session, Page rootPage) { var archives = session.Query<Page>().Where(p => p != rootPage && p.Path.StartsWith(rootPage.Path)) .GroupBy(p

所以,我有一个类似的问题

public static IEnumerable<Archive> GetArchivesRecursive(this ISession session, Page rootPage)
{
    var archives = session.Query<Page>().Where(p => p != rootPage && p.Path.StartsWith(rootPage.Path))
    .GroupBy(p => new { Year = p.Published.Year, Month = p.Published.Month })
    .Select(g => new Archive
    {
            ContextPageId = rootPage.Id,
            Year = g.Key.Year,
            Month = g.Key.Month,
            TotalPageCount = g.Count(),
            PublicPageCount = g.Count(p => p.State == PageState.Public && p.Published <= DateTime.UtcNow)
    })
    .ToList();

    // ContextPageId has old value (id of the first rootPage used since app start)
    // Why do I have to do this?
    archives.ForEach(a => a.ContextPageId = rootPage.Id);
    return archives;
}
public static IEnumerable GetArchivesRecursive(此ISession会话,Page rootPage)
{
var archives=session.Query().Where(p=>p!=rootPage&&p.Path.StartsWith(rootPage.Path))
.GroupBy(p=>new{Year=p.Published.Year,Month=p.Published.Month})
.选择(g=>new Archive
{
ContextPageId=rootPage.Id,
年份=g.Key.Year,
月份=g.Key.Month,
TotalPageCount=g.Count(),
PublicPageCount=g.Count(p=>p.State==PageState.Public&&p.Published a.ContextPageId=rootPage.Id);
归还档案;
}

出于某种原因,ContextPageId属性会获取所使用的第一个rootPage参数的值。

好吧,很有趣,我的NH 3.2在试图从
选择
内部查询的输入中获取值时,实际上会因
不匹配的ReenedeException
而失败。您使用的是哪个版本

无论如何,看起来您只是无法在投影中使用查询外部的值(
Select
)这可能是NHibernate的Linq限制。您的版本似乎缓存了
Select
中编译的表达式,忽略了它依赖于变量的事实。
DateTime
值对于所有调用也是相同的,不是吗

稍微干净一点的解决方法可以如下所示:

.Select(g => new
{
    Year = g.Key.Year,
    Month = g.Key.Month,
    TotalPageCount = g.Count(),
    PublicPageCount = g.Count(p => p.State == PageState.Public && p.Published <= DateTime.UtcNow)
})
.AsEnumerable()
.Select(g => new Archive
{
    ContextPageId = rootPage.Id,
    Year = g.Year,
    Month = g.Month,
    TotalPageCount = g.TotalPageCount,
    PublicPageCount = g.PublicPageCount
})
.ToList();
。选择(g=>new
{
年份=g.Key.Year,
月份=g.Key.Month,
TotalPageCount=g.Count(),
PublicPageCount=g.Count(p=>p.State==PageState.Public&&p.已发布的新存档
{
ContextPageId=rootPage.Id,
年=克年,
月=g.月,
TotalPageCount=g.TotalPageCount,
PublicPageCount=g.PublicPageCount
})
.ToList();

编辑我仔细查看了一下,这确实是一个已知的NHibernate错误。请参见和。

好吧,非常有趣的是,我的NH3.2在尝试在
选择
内部查询中输入值时,对于更简单的查询,
不匹配的reenodeexception
实际上失败了。您使用的是哪个版本g

无论如何,看起来您只是无法在投影中使用查询外部的值(
Select
)这可能是NHibernate的Linq限制。您的版本似乎缓存了
Select
中编译的表达式,忽略了它依赖于变量的事实。
DateTime
值对于所有调用也是相同的,不是吗

稍微干净一点的解决方法可以如下所示:

.Select(g => new
{
    Year = g.Key.Year,
    Month = g.Key.Month,
    TotalPageCount = g.Count(),
    PublicPageCount = g.Count(p => p.State == PageState.Public && p.Published <= DateTime.UtcNow)
})
.AsEnumerable()
.Select(g => new Archive
{
    ContextPageId = rootPage.Id,
    Year = g.Year,
    Month = g.Month,
    TotalPageCount = g.TotalPageCount,
    PublicPageCount = g.PublicPageCount
})
.ToList();
。选择(g=>new
{
年份=g.Key.Year,
月份=g.Key.Month,
TotalPageCount=g.Count(),
PublicPageCount=g.Count(p=>p.State==PageState.Public&&p.已发布的新存档
{
ContextPageId=rootPage.Id,
年=克年,
月=g.月,
TotalPageCount=g.TotalPageCount,
PublicPageCount=g.PublicPageCount
})
.ToList();

编辑我仔细查看了一下,这确实是一个已知的NHibernate错误。请参阅和。

NH版本似乎是3.2.0.4000,通过nuget安装。我想我还必须检查DateTime部分。NH版本似乎是3.2.0.4000,通过nuget安装。我想我还必须检查DateTime部分。