城堡Activerecord: FindAll()由子/使用外键id表达式
本文关键字:表达式 id 由子 Activerecord FindAll 城堡 | 更新日期: 2023-09-27 18:16:08
我需要基于ActiveRecord类(FindByFleetAndJob()
,下面)的子对象进行查询。通常情况下,我会使用对象的实例,但在这种情况下,我没有它们,并且不想为了获取查询对象而对数据库进行两次访问。我尝试了以下方法,为表达式创建虚拟对象:
[ActiveRecord("Alerts")]
public class Alert : ActiveRecordBase<Alert>
{
[PrimaryKey]
public int Id { get; set; }
[BelongsTo("AssociatedFleetId")]
public Fleet AssociatedFleet { get; set; }
[BelongsTo("AssociatedJobId")]
public Job AssociatedJob { get; set; }
...
public static Alert[] FindByFleetAndJob(int fleetId, int jobId)
{
var criteria = new List<ICriterion>();
criteria.Add(Expression.Eq("AssociatedFleet", new Fleet { Id = fleetId }));
criteria.Add(Expression.Eq("AssociatedJob", new Job { Id = jobId }));
return FindAll(criteria.ToArray());
}
}
我已经成功地完成了其他查询,但由于某种原因,这一个抛出:
对象引用未保存的瞬态实例-在刷新之前保存该瞬态实例。类型:数据对象。作业,实体:数据对象。FCJob # 123
所以我的问题是,有没有一种方法来打击这个异常,或者有一种方法来改变查询只是传递子对象的id,而不是对象本身?可以理解,执行以下操作不会找到名称为AssociatedJobId:
的属性。criteria.Add(Expression.Eq("AssociatedJobId", jobId));
虽然这基本上是我想要达到的。
许多谢谢。您可以尝试以下代码,但我是所以不确定它是否正确:
return FindAll(
Subqueries.PropertyIn("AssociatedFleet", DetachedCriteria.For<Fleet>().Add(Expression.Eq("Id", fleetId)).SetProjection(Projections.Property("Id")))
, Subqueries.PropertyIn("AssociatedJob", DetachedCriteria.For<Job>().Add(Expression.Eq("Id", jobId)).SetProjection(Projections.Property("Id")))
);
问候Juy Juka