0

Nhibernateで作成しようとしているクエリ:

SELECT _Eligible_Claims.ClaimID, _Eligible_Claims.DateFilled, _Eligible_Claims.NDC, _Eligible_Claims.Cost
From _Eligible_Claims
INNER JOIN _Files_Claims ON _Files_Claims.FileID = _Eligible_Claims.FileID

_Eligible_Claimsはビューであり(したがって、キーはありません)、_Files_ClaimsのPKは「FileID」です。

Eligible_Claimsマップ:

public EligibleClaimsMap()
    {
        ReadOnly();
        Table("_Eligible_Claims");

        Id(x => x.UniqueIdentifier, "Id")
            .GeneratedBy.Guid();

        Map(x => x.ApplicationID, "ApplicationID")
            .Not.Nullable();

        Map(x => x.BenOp, "BenOp")
            .Not.Nullable();

        Map(x => x.BenOpID, "BenOpID")
            .Not.Nullable();

        Map(x => x.MemberID, "MemberID")
            .Nullable();

        Map(x => x.ClaimID, "ClaimID")
            .Not.Nullable();

        Map(x => x.NDC, "NDC")
            .Not.Nullable();

        Map(x => x.DateFilled, "DateFilled")
            .Not.Nullable();

        Map(x => x.Cost, "Cost")
            .Not.Nullable();

        Map(x => x.DrugID, "DrugId")
            .Nullable();

        Map(x => x.CategoryID, "CategoryId")
            .Nullable();

         Map(x => x.FileID, "FileID")
            .Not.Nullable();
    }

_Files_Claimsマッピング:

public ClamFileMap()
    {
        Table("_Files_Claims");

        Id(x => x.ID, "FileID")
            .CustomType<UintToInt>()
            .GeneratedBy.Identity();

        Map(x => x.Filename, "FileName")
            .Not.Nullable();

        Map(x => x.Size, "FileSize")
            .Not.Nullable();

        Map(x => x.DateCreated, "DateCreated")
            .Not.Nullable();

        Map(x => x.DateEntered, "DateEntered")
            .Not.Nullable();

        Map(x => x.ClientID, "ClientID")
            .Not.Nullable()
            .CustomType<UintToInt>();

        Map(x => x.MasterTable, "MasterTable")
            .Nullable();

        Map(x => x.GUID, "GUID")
            .Nullable();

        Map(x => x.Protected, "Protected")
            .Not.Nullable();

        Map(x => x.BatchTimeStamp, "BatchTimeStamp")
            .Nullable();

        Map(x => x.ApplicationID, "ApplicationID")
            .Nullable();

        Map(x => x.ClaimCount, "Claims")
            .Not.Nullable();

        Map(x => x.TotalCost, "ClaimCost")
            .Not.Nullable();

        Map(x => x.PackageID, "PackageID")
            .Nullable();

        Map(x => x.TempDate, "TempDate")
            .Nullable();

        Map(x => x.Renamed, "Renamed")
            .Not.Nullable();

        Map(x => x.ERRPPackage, "ERRPPackage")
            .Not.Nullable();

        Map(x => x.Removed, "Removed")
            .Not.Nullable();

        Map(x => x.RemovedBy, "RemovedBy")
            .Nullable();

        Map(x => x.RemovedDate, "RemovedDate")
            .Nullable();

        Map(x => x.ImportedBy, "ImportedBy")
            .Nullable();

        Map(x => x.ImportedDate, "ImportedDate")
            .Nullable();

        Map(x => x.ControlTotal, "ControlTotal")
            .Nullable();
    }

私の現在のアプローチ:

var query = session.CreateCriteria<EligibleClaims>()
                   .CreateAlias("ClaimFile", "claimFile", NHibernate.SqlCommand.JoinType.InnerJoin);

デフォルトでClaimFileのFKにあるEligibleClaimsのPKに参加しようとしないため、これが機能することは期待できません。「CreateAlias」メソッドには、「withClause」と呼ばれる「ICriterion」の4番目のパラメーターのオーバーロードがあることに気付きました。それを実装する方法はありますか?それとも、別の角度からこれにアプローチする必要がありますか?

4

2 に答える 2

0

LINQがオプションの場合

var query = from file in session.Query<ClaimFile>()
            from claim in session.Query<EligibleClaims>()
            where file.FileId == claim.FileId
            select new { ... };
于 2012-10-11T13:09:30.747 に答える
0

また、オプションとして、_Files_Claimsテーブルへの参照をEligibleClaimsマップにマッピングするだけです。FKである必要はありませんが、とにかく機能するようです。

References(x => x.ClaimFile)
            .Column("FileID")
            .Not.LazyLoad()
            .Cascade.None();

次に、以下を使用します。

var query = session.CreateCriteria<EligibleClaims>()
            .CreateAlias("ClaimFile", "claimFile", NHibernate.SqlCommand.JoinType.InnerJoin);

動作しているようです。

于 2012-10-11T14:04:59.613 に答える