c# – 使用nhibernate Criteria API进行Eager Fetching

c# – 使用nhibernate Criteria API进行Eager Fetching,第1张

概述我试图在多个表上使用标准Api和急切加载. 我的精简实体看起来像这样: class Limit{ Risk {get; set;}}class Risk{ List<Company> Companies { get;set;}}class Company{ List<Address> OldAdresses {get;set;}}class Address 我试图在多个表上使用标准API和急切加载.

我的精简实体看起来像这样:

class limit{    Risk {get; set;}}class Risk{   @R_301_6818@<Company> CompanIEs { get;set;}}class Company{  @R_301_6818@<Address> oldAdresses {get;set;}}class Address{  string Street { get;set;}}

我的Criteria调用如下所示:

var CriterionGruppe = Expression.Eq("Account.ID",someGuID);var temp = _transaktion.Session.CreateCriteria(typeof(limit)).SetFetchMode("Risk",FetchMode.Eager).SetFetchMode("Risk.CompanIEs",FetchMode.Eager).Add(CriterionGruppe).SetResulttransformer(new distinctRootEntityResulttransformer()).@R_301_6818@<limit>();

地址仍然加载了许多选择.如何在我的标准电话中包含公司的旧地址.

我已经在ayende的博客中阅读了博客文章,并在stackoverflow上阅读了其他几个问题.但仍然没有运气.

我希望有人能指出我正确的方向.

在此先感谢彼得

When must we use eager loading in NHibernate? What is it’s usage?

NHibernate Eager Fetching Over Multiple Levels

Ayende Blog

解决方法
var account = _transaktion.Session.Load<Account>(someGuID);var temp = _transaktion.Session.CreateCriteria(typeof(limit))    .SetFetchMode("Risk",FetchMode.Eager)    .SetFetchMode("Risk.CompanIEs",FetchMode.Eager)    .SetFetchMode("Company.oldAddresses",FetchMode.Eager)    .Add(Expression.Eq("Account",account))    .SetResulttransformer(new distinctRootEntityResulttransformer())    .@R_301_6818@<limit>();

然而,这是非常低效的.您正在加载大量重复数据以进行1 SQL查询.一个更好的方法是

>加载实际需要的投影>使用Futures和Batched延迟加载来避免单个笛卡尔结果集并选择n 1.

总结

以上是内存溢出为你收集整理的c# – 使用nhibernate Criteria API进行Eager Fetching全部内容,希望文章能够帮你解决c# – 使用nhibernate Criteria API进行Eager Fetching所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1263653.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存