我有以下查询:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
select e;
Run Code Online (Sandbox Code Playgroud)
一切正常,我得到我的设备,它正确加载制造商表(热切).但是,当我尝试执行以下多对多查询时:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
from cce in e.ContractEquipments
where cce.Contracts.EndedOn >= DateTime.Today
select e;
Run Code Online (Sandbox Code Playgroud)
其中"ContractEquipments"是"设备"和"合同"之间的多对多查找,但是当此查询运行时,制造商表不再容易加载.知道如何在不执行以下操作的情况下解决此问题:
if (MyEntity.Manufacturers.IsLoaded == false)
MyEntity.ManufacturersReference.Load()
Run Code Online (Sandbox Code Playgroud)
这个项目需要几个小时执行,我想保持数据库调用的数量.
编辑#1:
我也尝试了这个没有成功:
var MyQuery = from e in ContractContext.Equipments.Include("Manufacturers")
where e.Customers.ID == customer.ID
join cce in ContractContext.ContractEquipments
on e.ID equals cce.Equipments.ID
where cce.Contracts.EndedOn >= DateTime.Today
select e;
Run Code Online (Sandbox Code Playgroud) 我正在尝试加载一些子实体,当我尝试添加Include()方法时,我收到编译器错误(即它无法找到它).
alt text http://img297.imageshack.us/img297/5638/whatthec.png
呃......有人可以帮我解决这个问题吗?
您好我有以下代码使用带有linq的nhibernate 3.0从我的数据库中检索数据 -
public IQueryable<myEntity> getEntityWithChild
{
get { return _currentSession.Query<myEntity>().Fetch(c => c.myOtherEntity); }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将其传递给视图时,我收到以下错误,这不是非常具体.当我没有急于使用以下装载时,这工作正常 -
public IQueryable<myEntity> getEntityWithChild
{
get { return _currentSession.Query<myEntity>(); }
}
Run Code Online (Sandbox Code Playgroud)
但是每次其他实体延迟加载时我都会创建一个单独的查询.有没有人在此之前看到这个可能能指出我正确的方向.谢谢你的任何想法.
System.NotSupportedException was unhandled by user code
Message=Specified method is not supported.
Source=NHibernate
StackTrace:
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process(IASTNode ast, ISessionFactoryImplementor factory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory) …Run Code Online (Sandbox Code Playgroud) 我有两个名为Category和Product的实体,其中1:n关系.
我希望得到一个带有孩子的分类.
这是我的linq:
_db.Categories.Where(c => c.CategoryID == catID)
.Include(c => c.Products.OrderBy(p => p.ProductID))
.SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)
由于orderby,此查询使用以下异常强制执行.
Include路径表达式必须引用在类型上定义的导航属性.使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性.参数名称:路径
linq linq-to-entities entity-framework eager-loading ef-code-first
我的模型设计中有一个非常深的关系树,也就是说,根实体包含一组实体,这些实体包含更多其他实体的集合,这些实体包含更多集合并且在...上我开发了一个其他开发人员拥有的业务层用于执行操作,包括获取/保存数据.
然后,我在考虑应对这种情况的最佳策略是什么.我不能允许在检索实体时,EF解析所有依赖树,因为它将以大量无用的JOIN结束(无用因为我可能不需要下一级别的数据).
如果我禁用延迟加载并强制执行急需的加载,它会按预期工作,但如果其他开发人员调用child.Parent.Id而不是child.ParentId尝试执行新的操作(如新的需求或在开始时未考虑的功能),它将获得一个NullReferenceExceptionif这种依赖性没有被包括在内,这很糟糕......但这将是一个"快速错误",它可以立即修复.
如果我启用延迟加载,则每次访问时,访问child.Parent.Id而不是以child.ParentId对DB的独立查询结束.它不会失败,但它更糟糕,因为没有错误,只有性能下降,所有代码都应该被审查.
我对这两种解决方案中的任何一种都不满意.
我不满意包含null或空集合的实体,而实际上并非如此.
我不满意让EF随时向数据库执行任意查询.如果可能的话,我想在一次拍摄中获得所有信息.
所以,我提出了几个可能的解决方案,涉及禁用延迟加载和强制执行急切加载,但不确定哪个更好:
我可以创建一个EntityBase类,它包含表中没有集合的数据,因此无法访问它们.包含关系的具体实现,问题是你没有太多的灵活性,因为C#不允许多重继承.
我可以创建"掩盖"隐藏在该方法调用中不可用的属性的对象的接口.例如,如果我有一个User.Roles属性,为了向所有用户显示网格,我不需要解析该.Roles属性,所以我可以创建一个不包含这种属性的接口'IUserData'.
但是,如果这个额外的工作是值得的,我不会,也许快速NullReferenceException指示"此属性尚未加载"就足够了.
如果属性是虚拟的并且没有被覆盖/设置,是否可以抛出特定的异常类型?
你用什么方法?
谢谢.
编辑 - 使用'includes'生成SQL'IN'子句.使用Oracle时,这有1000项限制.它不适用于我的公司.还有其他解决方案吗?
是否可以在关联上急切加载关联?
例如,假设我有一个学院课程,一个学院有很多学生.每个学生都属于student_level
class Academy < ActiveRecord::Base
has_many :students
end
class Student < ActiveRecord::Base
belongs_to :academy
belongs_to :student_level
end
class StudentLevel < ActiveRecord::Base
has_many :students
end
Run Code Online (Sandbox Code Playgroud)
是否有可能在学院中定制关联,以便在我加载学生时,我总是在学生中加载student_level?
换句话说,我希望以下代码段总共产生一个或两个查询,而不是每个学生一个查询:
@academy.students.each do |student|
puts "#{student.name} - #{student.student_level.level_name}"
end
Run Code Online (Sandbox Code Playgroud)
我知道如果我将学生从一个协会改为一个方法,我可以做到这一点,但我不想这样做,因为我无法在其他查询中将学生作为一个关联引用.我也知道我可以通过以下方式在SQL中执行此操作,但我想知道是否有一种方法可以在我的关联上没有finder_sql时执行此操作,因为现在我需要在我的默认范围更改时更新我的finder_sql,这赢了不加载关联:
SELECT students.*, student_levels.* FROM students
LEFT JOIN student_levels ON students.student_level_id = student_levels.id
WHERE students.academy_id = ACADEMY_ID_HERE
Run Code Online (Sandbox Code Playgroud) 宝石子弹说我在装载到页面的每餐食物加载meal_foods时出现N + 1错误.让我解释...
在我的rails应用程序中,我有一些嵌套的部分呈现如下:
膳食>膳食...
因此,呈现多餐,然后对于每个呈现的餐,其中相应的餐食也在其中呈现(如果有的话).
这是代码.
在用餐/秀中:
<% if @meals != nil %>
<%= render(partial: "meal", collection: @meals) %>
<% else %>
<p style="text-align:center">No meals created yet.</p>
<% end %>
Run Code Online (Sandbox Code Playgroud)
这是在_meals.html.erb中
<tbody>
<%= render(partial: "meal_foods/meal_food", collection: meal.meal_foods) %>
</tbody>
Run Code Online (Sandbox Code Playgroud)
最后,这是_meal_foods.html.erb的一部分
<td class="left"><%= meal_food.name %></td>
<td class="left">
<%= form_for meal_food, action: :update do |f| %>
<%= f.text_field :servings %>
<% end %>
</td>
Run Code Online (Sandbox Code Playgroud)
膳食控制器:
def show
@meals = current_client.meals
@new_meal = current_client.meals.build
end
Run Code Online (Sandbox Code Playgroud)
具体错误:
N+1 Query detected
Meal => [:meal_foods] …Run Code Online (Sandbox Code Playgroud) 使用来自https://github.com/snipe/laravel4-starter的 Laravel 4.1入门套件,我有两个模型:类别和兴趣.两者都是软删除的.我希望索引视图根据用户的意愿显示3个不同的列表:"全部显示","显示已删除"和"显示未删除".一切都很好,直到我在它们之间添加了HasMany/BelongsTo关系.
楷模:
class Category extends Elegant
{
protected $softDelete = true;
public function interests()
{
return $this->hasMany('Interest');
}
}
class Interest extends Elegant
{
protected $softDelete = true;
public function category()
{
return $this->belongsTo('Category');
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当视图调用$interest->category->name属于软删除类别的兴趣时,一切都会爆发ErrorException: Trying to get property of non-object.我怀疑这是因为它$interest->category是NULL,因为它已被软删除,因为它没有被加载.
控制器:
class InterestsController extends AdminController
{
public function getIndex()
{
$showDisabled = Utility::GetShowDisabled();
switch ($showDisabled) {
case 'only':
// How to load *only* soft-deleted Interest with their categories …Run Code Online (Sandbox Code Playgroud) 我有2个型号:User和Team
有多种类型的用户(在本例中为Mentors和Moderators),它们使用Usermodel()中的属性进行区分。User和之间的关联Team如下:
User.hasMany(models.Team, {as: 'Mentors', through: models.TeamMentor, foreignKey: 'mentorId'});
User.hasMany(models.Team, {as: 'Moderators', through: models.TeamModerator, foreignKey: 'moderatorId'});
Team.hasMany(models.User, {through: models.TeamMentor, foreignKey: 'teamId'});
Team.hasMany(models.User, {through: models.TeamModerator, foreignKey: 'teamId'});
Run Code Online (Sandbox Code Playgroud)
现在,我尝试获取团队的详细信息以及分配给团队的所有指导者和主持人的单独对象。我从文档中了解了多对多关系的获取器和设置器,但是由于这两个模型之间存在两种不同的关联,因此我不确定如何使用该方法:
在这种情况下,如何正确查询团队的详细信息?
PS:TeamMentor并且TeamModerator是空模型,可以帮助许多对许多联接
您必须已经看到以下功能(在Facebook上),一个带有一些评论的帖子,每个评论都有一个类似的计数器。
https://img4.hostingpics.net/pics/67853820170616003640LaravelNewsAccueil.png
在laravel中,它将像
所以,现在我想获得10条带他们的评论的帖子,每个评论都带有类似计数器。
Post::with('comments')->withCount('comments.likes')->take(10)->get();
Run Code Online (Sandbox Code Playgroud)
这根本不起作用。
Post::with('comments')->withCount('comments')->take(10)->get();
Run Code Online (Sandbox Code Playgroud)
这计算了每个帖子的所有评论,我想计算每个帖子的每个评论的所有赞。
eager-loading ×10
.net ×2
eloquent ×2
laravel ×2
linq ×2
activerecord ×1
associations ×1
c# ×1
database ×1
laravel-4 ×1
lazy-loading ×1
many-to-many ×1
nhibernate ×1
node.js ×1
orm ×1
partials ×1
sequelize.js ×1
soft-delete ×1
sql ×1