2

わかりました、これは本当に簡単なはずです。私はNHibernateを初めて使用しますが、検索したところどこでもこれに関する矛盾する答えが得られ、どれも機能していないようです。基本的に、次の SQL クエリをコードに実装する必要があります。特定の参加者の最新のレコードを返すだけです。

select *
from result
where ParticipantId = 1
and ResultDate = (select MAX(resultDate)
                  from Result
                  where ParticipantId = 1)

NHibernate 3.3 で Fluent NHibernate を使用しています。以下のコードを使用して、where 句に「and」を使用せずにデータを取得できますが、最新のレコードに制限しようとすると、何も機能しません。

var resultSet = session.Query<Result>()
.Where(r => r.Participant.ParticipantId == 1);

完全を期すために、ここに私のドメインとマッピング ファイルも含めます。さらに情報が必要な場合はお知らせください。

public class Result
{
    public virtual int ResultId { get; set; }
    public virtual Participant Participant { get; set; }
    public virtual ResultType ResultType { get; set; }
    public virtual float? ResultValue { get; set; }
    public virtual string ResultText { get; set; }
    public virtual DateTime ResultDate { get; set; }
    public virtual int? Systolic { get; set; }
    public virtual int? Diastolic { get; set; }
    public virtual DateTime? DateAdded { get; set; }
    public virtual string AddedBy { get; set; }
    public virtual DateTime? DateChanged { get; set; }
    public virtual string ChangedBy { get; set; }
}

public ResultMap() 
{
    Table("Result");
    LazyLoad();
    Id(x => x.ResultId).GeneratedBy.Identity().Column("ResultId");
    References(x => x.Participant).Column("ParticipantId");
    References(x => x.ResultType).Column("ResultTypeId");
    Map(x => x.ResultValue).Nullable();
    Map(x => x.ResultText).Nullable().Length(100);
    Map(x => x.ResultDate).Nullable();
    Map(x => x.Systolic).Nullable();
    Map(x => x.Diastolic).Nullable();
    Map(x => x.DateAdded).Nullable();
    Map(x => x.AddedBy).Nullable().Length(100);
    Map(x => x.DateChanged).Nullable();
    Map(x => x.ChangedBy).Nullable().Length(100);
}

最近のデータを取得するための簡単な解決策について何か考えはありますか? 改善点を比較するためにすぐに必要になるため、最後の 2 つの日付を取得する方法を教えてくれたボーナス ポイント。前もって感謝します!

4

1 に答える 1