这些是我的实体(简体):
public class IdentificationRequest
{
private int id;
private ICollection<IdentificationRequestStateHistoryItem> stateHistoryItems;
public virtual string Id
{
get { return id; }
private set { id = value; }
}
public virtual IEnumerable<IdentificationRequestStateHistoryItem> StateHistoryItems
{
get { return stateHistoryItems; }
private set { stateHistoryItems = new List<IdentificationRequestStateHistoryItem>(value); }
}
public void ChangeState(IdentificationRequestState state)
{
// state transition here
var stateHistoryItem = new IdentificationRequestStateHistoryItem(state, this);
stateHistoryItems.Add(stateHistoryItem);
}
}
public class IdentificationRequestStateHistoryItem
{
private int id;
private IdentificationRequestState state;
private EntityTimestamp timestamp;
public virtual string Id
{
get { return id; }
private set { id = value; }
}
public virtual IdentificationRequestState State
{
get { return state; }
private set { state = value; }
}
public virtual EntityTimestamp Timestamp
{
get { return timestamp; }
private set { timestamp = value; }
}
}
public class IdentificationRequestState
{
// possible states are
// Received, then id = 10
// Finished, then id = 20
private int id;
private string name;
public virtual string Name
{
get { return name; }
private set { name = value; }
}
public virtual string Id
{
get { return id; }
private set { id = value; }
}
}
public class EntityTimestamp
{
private DateTime createdOn;
public virtual DateTime CreatedOn
{
get { return createdOn; }
private set { createdOn = value; }
}
private IUser createdBy;
public virtual IUser CreatedBy
{
get { return createdBy; }
private set { createdBy = value; }
}
private DateTime changedOn;
public virtual DateTime ChangedOn
{
get { return changedOn; }
private set { changedOn = value; }
}
private IUser changedBy;
public virtual IUser ChangedBy
{
get { return changedBy; }
private set { changedBy = value; }
}
}
因此,上面的内容与下面的内容类似,并且在数据库中也是如此。
IdentificationRequest
可以跟踪其IdentificationRequestState
过渡。因此,每次分配新的IdentificationRequestState
时,都会创建一个新的IdentificationRequestStateHistoryItem
并将其放入多个历史项的集合中。这意味着,当前IdentificationRequestState
是最后添加的IdentificationRequest
(以createdOn日期表示)。所以现在我的问题是,查询看起来如何,其中列出了所有谁的当前状态为已接收或已完成。
这是我到目前为止所得到的:
private ICollection<IdentificationRequest> GetByCurrentState(IdentificationRequestState state)
{
var session = GetCurrentSession();
var subCriteria = DetachedCriteria.For(typeof(IdentificationRequestStateHistoryItem))
.SetProjection(Projections.Property("identificationRequest.Id" ));
subCriteria.Add(Restrictions.Eq("State", state));
var criteria = session
.CreateCriteria(typeof (IdentificationRequest))
.Add(Subqueries.PropertyIn("Id", subCriteria))
.SetResultTransformer(new NHibernate.Transform.DistinctRootEntityResultTransformer());
return criteria.List<IdentificationRequest>();
}
但是,当使用此查询并搜索其当前状态为Received的标识请求时,由于该请求的状态为以前的Received,因此我也会获取其当前状态为Finished的请求。所以我需要用Max(CreatedOn)做些什么?
NHibernate映射:
<class name="IdentificationRequest" table="IdentificationRequest">
<id name="Id" column="IdentificationRequestId" unsaved-value="-1">
<generator class="identity"/>
</id>
<bag name="stateHistoryItems" access="field" order-by="CreatedOn desc" fetch="join" cascade="all-delete-orphan" lazy="false">
<key column="IdentificationRequestId"/>
<one-to-many class="IdentificationRequestStateHistoryItem"/>
</bag>
</class>
<class name="IdentificationRequestStateHistoryItem" table="IdentificationRequestStateHistoryItem">
<id name="Id" column="IdentificationRequestStateHistoryItemId" unsaved-value="-1">
<generator class="identity"/>
</id>
<many-to-one name="identificationRequest" access="field" lazy="false" cascade="none" column="IdentificationRequestId" class="IdentificationRequest"></many-to-one>
<many-to-one name="State" lazy="false" fetch="join" cascade="none" column="IdentificationRequestStateId" class="IdentificationRequestState"></many-to-one>
<component name="Timestamp" class="EntityTimestamp">
<property name="CreatedOn"/>
<component name="CreatedBy" class="User">
<property name="Name" column="CreatedBy" />
</component>
<property name="ChangedOn"/>
<component name="ChangedBy" class="User">
<property name="Name" column="ChangedBy" />
</component>
</component>
</class>
<class name="IdentificationRequestState" table="IdentificationRequestState">
<id name="Id" column="IdentificationRequestStateId" unsaved-value="-1">
<generator class="assigned"/>
</id>
<property name="Name"/>
</class>
最佳答案
通过拥有IdentificationRequest.CurrentState属性,您将省去很多麻烦。
您对max()的想法是正确的。您可以添加另一个子条件,在其中获取该请求的所有请求状态的max(date),然后对现有子条件添加限制,以使其日期=该最大日期。毛,但这是我唯一能想到的方法。