我有一个要求加载一个名为Node的复杂对象...它不是那么复杂...它看起来如下: -
一个节点有一个参考的EntityType具有一对多与物业这反过来有一对多与PorpertyListValue
public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new …Run Code Online (Sandbox Code Playgroud) <?php
class Cat extends Eloquent {
public function user() {
return $this->belongsTo('User');
}
}
class User extends Eloquent {
public function cats() {
return $this->hasMany('Cat');
}
}
Run Code Online (Sandbox Code Playgroud)
现在:
$cats = Cat::with('user')->get();
Run Code Online (Sandbox Code Playgroud)
执行2个查询:
select * from `cats`
select * from `users` where `users`.`id` in ('1', '2', 'x')
Run Code Online (Sandbox Code Playgroud)
为什么不能这样做:
select * from cats inner join users on cats.user_id = users.id
Run Code Online (Sandbox Code Playgroud)
对于那些说表中有两个id列的人来说,使用别名可以很容易地避免这种情况:
select
c.id as cats__id,
c.name as cats__name,
c.user_id as cats__user_id,
b.id as users__id,
b.name as users__name
from cats c
inner join …Run Code Online (Sandbox Code Playgroud) 我想知道如何在使用Repository模式时正确处理复杂对象图的急切加载问题.我猜这不是ORM特有的问题.
第一次尝试:
public interface IProductRepository : IRepository<Product>
{
Product GetById(int id);
IProductRepository WithCustomers();
}
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但这将涉及一直重复自己(在各地的存储库实现中编写自定义'With'方法).
下一步方法:
public interface IRepository<T> where T : IAggregateRoot
{
...
void With(Expression<Func<T, object>> propToExpand);
}
Run Code Online (Sandbox Code Playgroud)
With 方法会将一个项目添加到私有集合中,稍后将使用该项目来查找在检索必要的实体时应该急切加载哪些道具.
这种工作很好.但我不喜欢用法:
productRepository.With(x=>x.Customer);
productRepository.With(x=>x.Price);
productRepository.With(x=>x.Manufacturer);
var product = productRepository.GetById(id);
Run Code Online (Sandbox Code Playgroud)
基本上 - 问题是没有链接.我希望它是这样的:
var product = productRepository
.With(x=>x.Customer)
.With(x=>x.Price)
.With(x=>x.Manufacturer)
.GetById(id);
Run Code Online (Sandbox Code Playgroud)
我无法做到这一点.即使我可以 - 我不确定这个解决方案是否优雅.
这导致我缺少一些基本的想法(在任何地方缺乏例子).有没有不同的方法来处理这个?什么是最佳做法?
我正在运行Ruby on Rails 3.1.我阅读了以下有关急切加载的文章和文档,我想找到一种正确的方法来做事:
在#2说:
请注意,使用Post.includes([:author,:comments])等条件.其中(['comments.approved =?',true]).all可能会产生意想不到的后果.
在#3说,这些意想不到的后果是:(注:例子是很相同的,所以我引用的博客文章中的确切文本,但你必须记住的解决办法,而不是具体实现):
此查询,因为它将使用LEFT JOIN,也会丢弃所有帖子,而不会在其任何评论上添加带有"first"字样的评论.
也就是说,如果存在非"关联"对象,则不会加载"主关联"对象.当我尝试通过添加一些条件(如.where(:category_relationships => {:user_id => @current_user.id})我之前的问题中)来尝试使用预先加载时会发生这种情况,但我不希望这种情况发生.
所以(失败主义者,因为我可能无法在我的情况下使用急切的加载,其中条件无法在has_many声明中设置- 请注意,在上面的代码中,@current_user.id"动态设置"与提及的网站中的示例不同),我想知道是否存在pratiques /技术/策略以限制数据库查询,因为我有"N + 1问题".
也许这些pratiques /技术/策略可以通过使用Ruby on Rails框架来实现...... #1说:
即使Active Record允许您像加入一样指定热切加载关联的条件,但推荐的方法是使用联接.
什么以及如何以正确的方式解决这个问题?
也许一个解决方案是通过运行特定的和分离的数据库查询来检索和构建自己需要加载的内容,但问题是如何将"检索到的""关联"对象"传递"/"关联"/"插入"到"主要关联的"对象,以便那些可以使用"一个là急切加载"的方式?也就是说,如何使用(请参阅上述问题以获取更多信息)使用类似的代码@article.comments并获得我自己急于加载的评论?在我急切加载之后,是否有可能/正确地将@article.comments = …
我发现我对延迟加载等感到困惑.
首先,这两个陈述是否相同:
(1) Lazy loading:
_flaggedDates = context.FlaggedDates.Include("scheduledSchools")
.Include ("interviews").Include("partialDayAvailableBlocks")
.Include("visit").Include("events");
(2) Eager loading:
_flaggedDates = context.FlaggedDates;
Run Code Online (Sandbox Code Playgroud)
换句话说,在(1)中,"包含"导致导航集合/属性与所请求的特定集合一起被加载,而不管您是否使用延迟加载......对吗?
在(2)中,语句将加载所有导航实体,即使您没有特别请求它们,因为您正在使用急切加载......对吗?
第二:即使您正在使用预先加载,在您"枚举可枚举"之前,数据实际上不会从数据库中下载,如下面的代码所示:
var dates = from d in _flaggedDates
where d.dateID = 2
select d;
foreach (FlaggedDate date in dates)
{
... etc.
}
Run Code Online (Sandbox Code Playgroud)
在foreach循环之前,数据实际上不会被下载("枚举")......对吗?换句话说,"var dates"行定义了查询,但直到foreach循环才执行查询.
鉴于(如果我的假设是正确的),渴望加载和延迟加载之间的真正区别是什么?似乎在任何一种情况下,数据在枚举之前都不会出现.我错过了什么吗?
(我的具体经验是代码优先,POCO开发,顺便说一句......虽然问题可能更普遍适用.)
entity-framework lazy-loading eager-loading entity-framework-4
好吧,我一直在玩一些急切的装载东西,并有两个模型类似于:
Class Recipe < ActiveRecord::Base
belongs_to :cookbook
has_many :recipetags
end
Run Code Online (Sandbox Code Playgroud)
和
Class Cookbook < ActiveRecord::Base
has_many :recipes, :include => [:recipetags]
end
Run Code Online (Sandbox Code Playgroud)
哪个好,当我找到一本食谱时,我急切地加载食谱,然后食谱急切加载:recipetags:
cb = Cookbook.find(10590, :include => [:recipes])
Run Code Online (Sandbox Code Playgroud)
但我想要做的就是每当我打开食谱时,让它自动引入所有热切的关联 - 基本上我想这样做:
rec = Recipe.find(123)
Run Code Online (Sandbox Code Playgroud)
并且在这种情况下急于加载:recipetags.
我意识到这似乎是微不足道的,但实际上我在Recipe上有大约4-5个关联,我只是没有在这里显示它们,而不是必须明确地执行:包含在每个查找调用我希望它发生.我假设我可以覆盖Recipe.find在Recipe模型中执行它,但是想知道是否有更清洁的方式....
我一直在努力熟悉实体框架.大部分内容似乎很简单,但我对使用Include方法和默认延迟加载的急切加载之间的区别感到困惑.两者似乎都加载了相关的实体,所以从表面看它们看起来像是做同样的事情.我错过了什么?
我试图在一次调用中急切地加载所有相关实体或实体集合.我的实体看起来像:
Class Person
{
public virtual long Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
}
Class Employee
{
public virtual long Id { get; set; }
public DateTime AppointmentDate { get; set; }
public virtual ICollection<EmployeeTitle> Titles { get; set; }
public virtual Person Person { get; set; }
}
Class EmployeeTitle
{
public virtual long Id { get; set; }
public virtual bool IsCurrent { …Run Code Online (Sandbox Code Playgroud) c# entity-relationship code-first eager-loading entity-framework-4.1
目标是使用LINQ to SQL向SQL Server 发出最少的查询,而不使用匿名类型.该方法的返回类型需要是IList <Child1>.关系如下:
Parent
Child1 Child2
Grandchild1
Run Code Online (Sandbox Code Playgroud)
Parent> Child1是一对多关系
Child1> Grandchild1是一对一的关系(其中n为0到无穷大)
Parent> Child2是一对一关系(其中n为0到无穷大)
我能够急切加载Parent,Child1和Grandchild1数据,从而导致向SQL Server发出一个查询.
带有加载选项的查询急切加载除兄弟数据(Child2)之外的所有数据:
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
dataContext.LoadOptions = loadOptions;
IQueryable<Child1> children = from child in dataContext.Child1
select child;
Run Code Online (Sandbox Code Playgroud)
我也需要加载兄弟数据.我尝试过的一种方法是将查询拆分为两个LINQ to SQL查询并将结果集合并在一起(不太漂亮),但是在访问兄弟数据时它仍然是延迟加载的.
添加兄弟加载选项将为每个Grandchild1和Child2记录向SQL Server发出查询(这正是我试图避免的):
DataLoadOptions loadOptions = new DataLoadOptions();
loadOptions.LoadWith<Child1>(o => o.GrandChild1List);
loadOptions.LoadWith<Child1>(o => o.Parent);
loadOptions.LoadWith<Parent>(o => o.Child2List);
dataContext.LoadOptions = loadOptions;
IQueryable<Child1> children = from child in dataContext.Child1
select child;
exec sp_executesql …Run Code Online (Sandbox Code Playgroud) 在我的项目中,我有许多Eloquent模型,它们在类中配置了如下所示的热切关系:
protected $with = [ 'countries', 'roles' ];
Run Code Online (Sandbox Code Playgroud)
但有时我只需要旧的普通模型而没有任何关系.我能以某种方式做到:
Model::noRelations()->all()
Run Code Online (Sandbox Code Playgroud)
真的不想使用查询构建器,也不想在少数情况下创建另一个类.
eager-loading ×10
eloquent ×2
lazy-loading ×2
automapping ×1
c# ×1
code-first ×1
database ×1
join ×1
laravel ×1
laravel-4 ×1
linq ×1
linq-to-sql ×1
nhibernate ×1
php ×1
ruby ×1