我正在使用 Fluent NHibernate。我在运行时有一个对象,其中包含可能已填充或未填充的惰性集合/属性。我计划序列化该对象,并需要在我这样做之前填充所有集合/属性。如何在运行时“热切加载”我的对象?
在过去的日子里,我正在制作一个示例应用程序来申请/学习 DDD。DDD 的原则之一(如果我错了,请纠正我)是对实体的所有更改都应该通过聚合根(AR)进行,并且 AR 应该加载他的子实体。这样更容易验证聚合一致性。只有一个小细节让我感到困扰。我无法理解 DDD 如何处理性能问题。想象一下,我有一个 Order(AR),比如说有 20000、30000 个 OrderLine。急切加载大量子记录时会存在性能问题。将订单说成 AR,您可以想象另一种可能发生这种情况的场景。我期待着阅读您对这个主题的看法。
DbContext使用预先加载查询 a时,需要Include("Navigation")填充导航属性。然而,在某些情况下,我想简单地为一个实体提供Include 所有导航属性。有没有办法做到这一点,或者有办法做到这一点?我假设你可以通过反思,但我宁愿避免这种情况。
我知道的:
var entity = db.Table.Include("Navigation1").Include("Navigation2").First();
Run Code Online (Sandbox Code Playgroud)
我想要的是:
var entity = db.Table.IncludeAll().First();
Run Code Online (Sandbox Code Playgroud) 我有以下查询非常慢。我是 Entity Framework 的新手,我相信它必须对 Eager Loading、Lazy Loading 或 Explicit Loading 做一些事情。需要帮助优化以下 C# 语句。
var queryResult = CurrentSession.Set<SomeType_T>().Include(a => a.SomeType1_T)
.Include(a => a.SomeType1_T.Catalog_Type_T)
.Include(a => a.SomeType1_T.SomeType4_T)
.Include(a => a.SomeType1_T.SomeType2_T)
.Include("SomeType1_T.SomeType2_T.SomeType3_T")
.Include(a => a.SomeType1_T.SomeType4_T.SomeType5_T)
.Include(a => a.SomeType1_T.SomeType5_T)
.Include(a => a.SomeType1_T.Questions_T)
.Include(a => a.SomeType1_T.Questions_T.Question_Type_T)
.Include(a => a.SomeType1_T.Members_T)
.Include(b => b.SomeMasterType_T)
.Include(b => b.SomeMasterType_T.SomeMasterType1_T)
.Include(c => c.SomeType6_T)
.Include(d => d.SomeType7_T)
.Include(d => d.SomeType8_T)
.Include(d => d.SomeType8_T1)
.Where(t => t.SomeType9_T == _MatchThisKey);
Run Code Online (Sandbox Code Playgroud) 我有工作职能,但是,我想限制每位顾问返回的治疗数量。
工作示例:
Clinic::where('user_id', Auth::id())
->with('consultants.specialism', 'consultants.treatments')
->first();
Run Code Online (Sandbox Code Playgroud)
建议的(但不起作用)示例:
Clinic::where('user_id', Auth::id())
->with('consultants.specialism')
->with(['consultants.treatments' => function ($query) {
$query->take(3);
}])
->first();
Run Code Online (Sandbox Code Playgroud)
不幸的是,takeorlimit函数将其限制为返回的处理总数。
我希望将每位顾问的治疗次数限制为最多 3 次,而不是总数。
请问我怎样才能实现这个目标?
我读过几篇关于为什么急切加载使用多个查询而不是加入此处、此处和此处的文章。但是,我认为有必要使用联接而不是急切加载。我将如何构造查询,以便可以访问子对象,就好像它是通常急切加载的对象一样?
示例:获取居住在某条街道上的人员,并同时加载该地址。我不想加载这个人的所有地址,因为他住在很多地方;仅匹配查询的位置。通过急切加载和 whereHas,我必须重复查询,而且查询并不总是这么简单:
People::with(['address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
}])->whereHas('address', function($query) use ($street_name){
return $query->where('street_name', $street_name);
})->get();
Run Code Online (Sandbox Code Playgroud)
可能
People::query()->join('address', function($join){
$join->on(...)
})->where('street_name', $street_name);
Run Code Online (Sandbox Code Playgroud)
那么问题是我不能使用这个:
$person->address
Run Code Online (Sandbox Code Playgroud)
有没有办法接受连接并对其进行按摩(使用选择?),使其看起来像是急切加载的?
我目前有一个页面,需要11秒钟才能加载。我正在使用Bullet Gem帮助我找到N + 1查询的发生位置。它给了我一些输出,但是我真的不知道该怎么做。这是Bullet的输出:
GET /events/1679/dashboard
USE eager loading detected
RSVP => [:tickets]
Add to your finder: :includes => [:tickets]
Call stack
/Users/cameronbass/Desktop/Work/blackbird-rsvp/app/decorators/rsvp_decorator.rb:54:in `tickets?'
/Users/cameronbass/Desktop/Work/blackbird-rsvp/app/views/accepted_rsvps/_list.html.erb:33:in `block in _app_views_accepted_rsvps__list_html_erb___1211423417683052584_70339569780320'
Run Code Online (Sandbox Code Playgroud)
告诉我放在这条线上
def tickets?
rsvp.tickets.any?
end
Run Code Online (Sandbox Code Playgroud)
这是关联:
has_many :tickets, through: :attendees
Run Code Online (Sandbox Code Playgroud)
Attendee.rb
has_one :ticket
Run Code Online (Sandbox Code Playgroud) 我正在制作一个用于工作的 laravel 应用程序,我需要为所有用户加载他们的附加角色,而不需要任何角色嵌套。我将本教程用于角色:https : //medium.com/@ezp127/laravel-5-4-native-user-authentication-role-authorization-3dbae4049c8a。如果我 public $with = ['roles'];在我的用户模型上使用它返回用户对象中的整个角色对象,我需要它只返回角色:'role_name';
/**
* set up eloquent between roles/user
*
* @return \Illuminate\Database\Eloquent\Relations\belongsToMany
*/
public function roles()
{
return $this->belongsToMany(Role::class);
}
Run Code Online (Sandbox Code Playgroud)
上面是我的 User 模型,下面是我的 Role 模型来定义关系。
/**
* provides a many-to-many relationship to User model
*
* @return User::class
*/
public function users()
{
return $this->belongsToMany(User::class);
}
Run Code Online (Sandbox Code Playgroud)
我认为通过将其添加到 User 模型中:
protected $appends = ['role_name'];
public function getRoleNameAttribute()
{
return $this->attribute['name'];
}
Run Code Online (Sandbox Code Playgroud)
它会返回所有内容,但它所做的只是创建一个 role_name: 'user_name'; 在模型上。所以我想我意识到我正在访问数据库中的用户表而不是角色表,但又不确定该怎么做。任何帮助将不胜感激。
我有以下三个模型:
class Parent < ApplicationRecord
has_many :children
has_many :assets
end
class Child < ApplicationRecord
belongs_to :parent
end
class Asset < ApplicationRecord
belongs_to :parent
end
Run Code Online (Sandbox Code Playgroud)
现在我需要通过父母找出属于孩子的资产。并且“资产”具有资产类型列。所以我需要做这样的事情
Parent.first.children.each do |child|
child.parent.assets.find_by(asset_type: "first").asset_value
end
Run Code Online (Sandbox Code Playgroud)
如何避免 N+1 查询?
导轨:5.1.6
红宝石:2.3.4
我正在尝试在我的项目中使用 Laravel 预加载,并且我已经阅读了有关它的文档。文档中的每个示例都是关于使用预加载获取模型的所有实例。但这只是获取所有实例而不仅仅是单个模型吗?考虑一下:
public function single(Coin $coin)
{
$coin = $coin->with('exchanges')->get();
return view('public.coin',compact('coin'));
}
Run Code Online (Sandbox Code Playgroud)
它是一种控制器方法,它使用路由绑定加载单个硬币并注入实例,我正在尝试急切加载该硬币的关系。但是当我在刀片视图文件中访问 $coin 时,我会得到所有硬币的列表。所以我不能急切地加载注入的模型实例?!
eager-loading ×10
c# ×3
laravel ×3
activerecord ×2
lazy-loading ×2
.net ×1
accessor ×1
asp.net-mvc ×1
bullet ×1
dbcontext ×1
eloquent ×1
join ×1
laravel-5.3 ×1
laravel-7 ×1
mutators ×1
nhibernate ×1
php ×1
ruby ×1