1

我们正在尝试使用 Nhibernate 未来查询来预先加载一些数据。正如您在调用 ToList() 时已经知道的那样,我们之前拥有的所有未来查询都将在一个事务中执行。

var selectedPhysicianIds = new List<int> {1, 2};

var query = this.physicianReviewQuery.Clone()
                .TransformUsing(new DistinctRootEntityResultTransformer())
                .AndRestrictionOn(p => p.Id)
                .IsIn(selectedPhysicianIds)
                .Future();

var collectionsQuery = this.session.QueryOver<Physician>()
                           .AndRestrictionOn(p => p.Id)
                           .IsIn(selectedPhysicianIds);
collectionsQuery.Clone().Fetch(p => p.Specialties).Eager.Future();
collectionsQuery.Clone().Fetch(p => p.HospitalPhysicianBridges).Eager.Future();
collectionsQuery.Clone().Fetch(p => p.SpecialtyPhysicianBridges).Eager.Future();

selectedPhysicians.AddRange(query.ToList());

此代码将生成以下查询集,

Select * from  PhysicianReview where PhysicianKey in (@p0, @p1)

Select * from Physician P left outer join Specialties S on P.Specialty = S.Specialty
Where P.PhysicianKey in (@p2, @p3)

Select * from Physician P left outer join HospitalBridge HB on P.Physician = HB.Physician
Where PhysicianKey in (@p4, @p5)

Select * from Physician P left outer join SpecialtyBridge SB on P.Physican = SB.Physician
Where PhysicianKey in (@p6, @p7)
    ',N'@p0 int,@p1 int,@p2 int,@p3 int,@p4 int,@p5 int,@p6 int,@p7 int,
    @p0=1,@p1=2,@p2=1,@p3=2,@p4=1,@p5=2,@p6=1,@p7=2

在查看 sql 查询时,相同数量的参数值将应用于具有不同参数名称的所有查询。

假设selectedPhysicianIds包含 1000 个整数的数组(用户可以选择他们想要的任何东西)。

var selectedPhysicianIds = new List<int> {1, 2,....998, 999, 1000};

在这种情况下,相同数量的参数值将应用于所有四个未来查询。所以参数总数将是(4 * 1000)4000。但是我们在sql server中有以下限制。“传入的请求参数太多,服务器最多支持2100个参数”

有没有办法在 Nhibernate 的帮助下解决这个问题?

4

1 回答 1

0

不,我相信我已经在评论中告诉过你。你有没有删除你的问题并重新发布?这将是非常糟糕的行为。

每个未来的查询都被视为具有自己的一组参数的不同查询。NHibernate 不会尝试将它们“相互化”,那样会过于复杂。

然后由您决定拆分查询以避免达到参数计数限制。最简单的方法:拆分您的 id 列表并执行多组未来调用,在构建下一组之前解析前一组。

否则忘记急切获取并坚持延迟加载。通过启用延迟加载的批量加载来避免 N+1 选择问题。这要容易得多。如果您需要关闭会话然后使用您的实体,则必须通过调用NHibernateUtil.Initialize()其延迟加载的属性来触发延迟加载,并在您的实体上循环。由于延迟加载批处理,它不会对已经加载的那些执行任何操作。另一种选择是在关闭会话之前将您的实体转换为视图模型之类的东西。

于 2017-07-10T17:02:28.423 回答