标签: eager-loading

在自引用表中急切地将Linq加载到SQL实体

我有2个相关的Linq to SQL问题.请参阅下面的图片,看看我的模型是什么样的.

问题1

我想知道如何User.AddedByUser在我的User 类/表上加载字段.该字段由字段上的关系生成User.AddedByUserId.该表是自引用的,我试图弄清楚如何让Linq to SQL User.AddedByUser急切地加载属性,即无论何时User加载/获取任何实体,它还必须获取User.AddedByUser和User.ChangedByUser.但是,据我所知,这可能会成为一个递归问题......

更新1.1:

我试过使用DataLoadOptions如下:

var options = new DataLoadOptions();
options.LoadWith<User>(u => u.ChangedByUser);
options.LoadWith<User>(u => u.AddedByUser);

db = new ModelDataContext(connectionString);
db.LoadOptions = options;
Run Code Online (Sandbox Code Playgroud)

但这不起作用,我在第2行得到以下异常:

System.InvalidOperationException occurred
  Message="Cycles not allowed in LoadOptions LoadWith type graph."
  Source="System.Data.Linq"
  StackTrace:
       at System.Data.Linq.DataLoadOptions.ValidateTypeGraphAcyclic()
       at System.Data.Linq.DataLoadOptions.Preload(MemberInfo association)
       at System.Data.Linq.DataLoadOptions.LoadWith[T](Expression`1 expression)
       at i3t.KpCosting.Service.Library.Repositories.UserRepository..ctor(String connectionString) in C:\Development\KP Costing\Trunk\Code\i3t.KpCosting.Service.Library\Repositories\UserRepository.cs:line 15
  InnerException:
Run Code Online (Sandbox Code Playgroud)

异常是不言自明的 - 对象图不允许是循环的.另外,假设第2行没有抛出异常,我很确定第3行会,因为它们是重复键.

更新1.2:

以下内容也不起作用(不与上面的Update 1.1结合使用):

var query = from u …
Run Code Online (Sandbox Code Playgroud)

c# eager-loading linq-to-sql self-reference

7
推荐指数
1
解决办法
5318
查看次数

memcached作为Rails中的Object存储

我在我的Rails应用程序中使用Memcached作为Object Store,我在其中存储了memcached中User对象的搜索结果

现在,当我获取数据时,我得到了Memcached Undefined Class/Module Error.我在这个博客中找到了解决这个问题的方法

http://www.philsergi.com/2007/06/rails-memcached-undefinded-classmodule.html

 before_filter :preload_models
  def preload_models
    Model1
    Model2
  end
Run Code Online (Sandbox Code Playgroud)

建议事先预装模型.我想知道是否有一个更优雅的解决方案来解决这个问题,并且使用预加载技术有任何缺点.

提前致谢

memcached ruby-on-rails models eager-loading

7
推荐指数
2
解决办法
2345
查看次数

在选择聚合时,如何处理Linq到NHibernate的Fetch异常?

我在asp.net mvc Grid(具体是telerik)上使用LINQ到NHibernate的IQueryable实现,我知道我需要为这个特定的网格急切地获取一些东西.

所以我的查询看起来像这样:

var query =  from s in repository.Query<MyClass>()
                     orderby s.Property.Name, s.Name
                     select s;

query = query.Fetch(x => x.Property);
Run Code Online (Sandbox Code Playgroud)

现在,如果我执行query.ToList(),一切都很好,我可以验证它在集成测试中是否有效.

这很棒.

但是,如果我执行query.Count()或其他聚合查询的东西,我会得到一个异常:

查询指定的连接提取,但是提取的关联的所有者在选择列表中不存在[FromElement {显式,不是集合连接,获取连接,获取非延迟属性,classAlias = 0,role =,tableName = [Property] ,tableAlias = property1,origin = MyClass myclass0_,colums = {myclass0_.PropertyGuid,className = Property}}] [.Count(.Fetch(.ThenBy(.OrderBy(NHibernate.Linq.NhQueryable`1 [MyClass],Quote(( s,)=>(s.Property.Name)),),Quote((s,)=>(s.Name)),),Quote((x,)=>(x.Property)),), )]

我知道它试图告诉我,我不能急于获取Property,因为MyClass不在select中,但问题是Count()实际上是通过Grid调用的,并且从我的代码外部处理.

我应该做的就是给网格一个IQueryable,它应该能够自己处理分页,排序等.

还有其他人不得不用NHibernate Fetching解决这个问题,你是如何解决它的?

linq-to-nhibernate eager-loading asp.net-mvc-2

7
推荐指数
1
解决办法
727
查看次数

Rails Eager Loading和where子句

我渴望加载一个模型对象及其关联:

user= User.includes(:posts).find(1)
Run Code Online (Sandbox Code Playgroud)

但是在代码中的某些点我想做这样的事情:

user.posts.where(:topic => "x")
Run Code Online (Sandbox Code Playgroud)

但这只是重新运行查询.所以我想我会这样做:

user.posts.select{|post| post.topic == "x" }
Run Code Online (Sandbox Code Playgroud)

这不会重新运行查询.但我有几个问题.

首先,这是正确的方法吗?

其次,我对这种情况下的选择有点困惑.因为当我运行最后一行时,即使我没有使用包含函数,第一次运行查询,然后再运行它,如果我再次运行它,它不会...那么是否涉及某种缓存?因为当我使用where子句时,它每次都运行查询.

谢谢.

ruby-on-rails eager-loading

7
推荐指数
1
解决办法
4297
查看次数

ActiveSupport :: Dependencies.autoload_paths:如何加载?

我在sinatra项目中使用ActiveSupport,并遵循一些同行的建议,我一直在使用ActiveSupport :: Dependencies.autoload_paths来简化我在开发中加载我的类.现在我正在接近部署日,我并不知道如何急切地加载它们.在Rails中,这很简单:只需设置config.cache_classes = true并按照自己的方式行事即可.但在Sinatra应用程序中,我没有看到如何急切加载它们.

activesupport sinatra eager-loading

7
推荐指数
0
解决办法
593
查看次数

MiniProfiler列出的额外查询

在我的控制器操作中,我included查看所需的所有关联,以避免多次调用数据库.(我试图将视图层隔离为仅渲染控制器收集的数据).


我发现视图仍然与数据库通信(17个查询): MiniProfiler


这些17 extra queries都不是必需的.因为我已经从控制台测试了控制器查询,并且它成功地收集了部分所需的所有数据_dropdown(在5个查询中)而没有任何进一步的数据库通信.

这是我的控制器中的查询,它可以避免这个N+1问题.(包括视图中调用的所有变量)


这是下拉代码:

- @messages.each do |message|
    %li.conversation-container
        %a{href: conversation_path(message.conversation_id)}
            - if message.sender != current_user 
                .notification-avatar{style: "background: url(#{message.sender.avatar_url}); background-size: contain; background-repeat: no-repeat; background-position: 50% 50%;"}
            - else
                - other_participant = message.conversation.conversation_participants.select{|p| p.user_id != current_user.id }.first.user 
                .notification-avatar{style: "background: url(#{other_participant.avatar_url}); background-size: contain; background-repeat: no-repeat; background-position: 50% 50%;"}
            %p
                %strong
                    - if message.sender != current_user 
                        = message.sender.name
                    - else
                        = other_participant.name
                %br
                - if message.sender == current_user …
Run Code Online (Sandbox Code Playgroud)

performance ruby-on-rails eager-loading preloading ruby-on-rails-3

7
推荐指数
1
解决办法
418
查看次数

Laravel 5渴望加载限制

我有两个表,比如说"users"和"users_actions",其中"users_actions"与用户有一个hasMany关系:

用户

id | name | surname | email...
Run Code Online (Sandbox Code Playgroud)

行动

id | id_action | id_user | log | created_at
Run Code Online (Sandbox Code Playgroud)

Model Users.php

class Users {
    public function action()
    { 
       return $this->hasMany('Action', 'user_id')->orderBy('created_at', 'desc');
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我想检索列表所有的用户他们的最后一个动作.

我看到 Users::with('action')->get(); 只通过简单地获取关系的第一个结果就可以轻松地给我最后一个动作:

foreach ($users as $user) {
   echo $user->action[0]->description;
}
Run Code Online (Sandbox Code Playgroud)

但我当然希望避免这种情况,只为每个用户选择最后一个动作.

我尝试使用约束,比如

Users::with(['action' => function ($query) {
    $query->orderBy('created_at', 'desc')
          ->limit(1);
    }])
->get();
Run Code Online (Sandbox Code Playgroud)

但是由于Laravel执行此查询,这给了我一个不正确的结果:

SELECT * FROM users_actions WHERE user_id IN (1,2,3,4,5)
ORDER BY created_at
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

这当然是错的.有没有可能在没有使用Eloquent对每条记录执行查询的情况下获得此功能?我是否犯了一些我没有看到的明显错误?我很擅长使用Eloquent,有时甚至是关系让我烦恼.

编辑: …

php eager-loading greatest-n-per-group eloquent laravel-5

7
推荐指数
3
解决办法
5227
查看次数

Rails从auto/eager load中排除文件夹

我想单独扩展我的rails应用程序的一些子部分,并避免加载整个代码库.

举个例子,让我们考虑一个APIv1与一个APIv2,但我也想扩展这个任何类/服务

是否可以从预先加载(生产)或自动加载(在开发中)中排除特定文件夹?

例如,

api-v1-production环境应该排除

controllers/api/v[^1]/**/*.rb
Run Code Online (Sandbox Code Playgroud)

api-v2-production环境应该排除

controllers/api/v[^2]/**/*.rb
Run Code Online (Sandbox Code Playgroud)

为了示例,我正在编写[^ x]作为除x之外的所有内容的方便表示法

我知道可以添加一些autoload/eager load文件夹,但是排除一些呢?(特别是如果它们在app/默认情况下是自动加载/急切加载的内部)

我想避免在内存中加载过多的类/服务等,我知道它们没用

ruby-on-rails autoload eager-loading ruby-on-rails-5

7
推荐指数
1
解决办法
377
查看次数

JPA 和 Hibernate:急切加载执行后续查询以获取所有数据,而不是仅在一个查询中执行此操作

我有以下疑问。我想知道为什么在使用 JPA 和 Hibernate 时,在ManyToOneOneToMany关系中执行预加载时,它会调用数据库以获取实体信息,但另外还会生成后续查询来获取每个子项。

另一方面,当使用带有 JOIN FETCH 的查询时,它会按照我的预期执行查询,一次获取所有信息,因为 fetchType 表示为“EAGER”。

这是一个简单的例子:

我有一个班级学生,它与班级教室有多对一的关系。

@Entity
@Table(name = "STUDENT")
public class Student {

@ManyToOne(optional = true, fetch = FetchType.EAGER)
        @JoinColumn(name = "ClassroomID")
        private Classroom mainClass;
Run Code Online (Sandbox Code Playgroud)

另一边有一个名为 Classroom 的类,如下:

@Entity
public class Classroom {

@OneToMany(cascade = CascadeType.ALL, mappedBy = "mainClass", fetch = FetchType.EAGER)
private List<Student> studentsList;
Run Code Online (Sandbox Code Playgroud)

在获取Classroom对象时,它会执行一次查询从自身获取信息,并执行后续查询以获取每个classRoom对象的studentsList中包含的每个学生的信息。

第一个查询:

Hibernate: 
/* SELECT
         r 
     FROM
         Classroom r 
     LEFT JOIN
         r.classStudents */ 

     select
         classroom0_.id as id1_0_,
         classroom0_.number as number2_0_ 
     from …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa eager-loading

7
推荐指数
1
解决办法
7028
查看次数

Rails急切加载与所选属性的关联

任何人都可以告诉我是否可以加载关联但只返回特定属性?

我想用他们的帐户检索一些订单,但只需要帐户名称.

Order.select([:id, :account_id]).includes(:account).limit(2)

ruby-on-rails eager-loading ruby-on-rails-3

6
推荐指数
1
解决办法
3327
查看次数