【问题标题】:Problem with Skip and Take in NHibernate 3 Linq queryNHibernate 3 Linq 查询中的跳过和接收问题
【发布时间】:2011-01-03 06:17:36
【问题描述】:

使用 linq to NHibernate (NHibernate v3) 我有以下 LINQ 查询:

    var session = this.GetSession();
    var rgn = this.Get(regionId);

    var query = from t in session.Query<Tag>()
                where
                    !(
                        from trn in session.Query<Translation>() 
                        where trn.Region.Id == regionId 
                        select trn.Tag.Id
                     )
                     .Contains(t.Id)

                select new Translation() {Id = t.Id, Tag = t, Region = rgn, TagTranslation=""};

    var count = query.Count();
    var untranslatedTags = query.Skip((page - 1)*pageSize).Take(pageSize);
    var countAfterSkipAndTake = untranslatedTags.Count();
    return untranslatedTags.ToList();
} 

count 变量确实返回了预期值。但是 countAfterSkipAndTake 返回相同的值。我本来希望它返回 pageSize(在本例中为 15)。最后一行 untranslatedTags.ToList() 返回异常。我相信 LINQ to NHibernate 没有完全实现,在我尝试下载主干之前,任何人都可以看到我做错了什么。

【问题讨论】:

    标签: nhibernate linq-to-nhibernate


    【解决方案1】:

    我猜想,因为我过去遇到过类似的问题,var count = query.Count(); 正在强制 nHibernate 编译查询,因此任何未来的修改都是徒劳的,因为它已经被执行了。

    要对此进行测试,请删除该行并查看 countAfterSkipAndTake 现在是否为 15。

    【讨论】:

    • 很遗憾没有。在尝试了各种不同的事情之后,NHibernate 的 LINQ 实现似乎不喜欢选择投影。我更新了我的 LINQ 语句以包含 skip 和 take 并用一个简单的 select() 调用替换了 select 投影,它起作用了。在另一个声明中,我想使用 Union 运算符,但我得到一个异常,指出 union 运算符尚未实现。似乎 LINQ to NHibernate 仍然存在一些问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多