Castle Activerecord:FindAll()by children /在Expression中使用外键ID

时间:2013-05-30 11:23:01

标签: c# castle-activerecord nhibernate-criteria

我需要根据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());
    }
}

我已经成功完成了其他查询,但由于某种原因,这个抛出:

  

对象引用未保存的瞬态实例 - 在刷新之前保存瞬态实例。键入:DataObjects.Job,Entity:DataObjects.FCJob#123

所以我的问题是,是否有办法打击这个异常,或者有没有办法改变查询只是传递子对象的id而不是对象本身?可以理解的是,执行以下操作时,找不到名称为AssociatedJobId的属性:

criteria.Add(Expression.Eq("AssociatedJobId", jobId));

虽然这基本上是我想要实现的目标。

非常感谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试以下代码,但我所以不确定它是否正确:

  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