0

私はnHibernateデータ レイヤーに Fluent を使用しています。ほとんどの場合nHibernate/LINQ、ストアド プロシージャによってデータを入力する必要があります。

私が抱えている問題は、クラス マッピングに Formula が含まれていることです。関数を呼び出すとnHibernate/LINQ、基になる変数が期待どおりに設定されます。関数を呼び出すとGetNamedQuery()、エラーがスローされます。
値を null にすることはできません。パラメータ名: フィールド名

の場合、Formula フィールドにデータが入力されないのは完全に論理的ですNamedQuery(明らかに、返されるすべてのレコードに対して SQL ステートメントを実行するのではなく、ここでサブクエリが必要です!)、式の値をストアド プロシージャ - または少なくともエラーをスローしないクエリ。

これは可能ですか?

地図

public class QuoteMap : ClassMap<Quote>
{
    public QuoteMap()
    {
        Id(x => x.Id).GeneratedBy.GuidComb();
        ...
        Map(x => x.ResponseCount).Formula("(SELECT COUNT(*) FROM QuoteResponse WHERE QuoteResponse.QuoteId = Id and QuoteResponse.Status = " + (int)QuoteResponseRepository.Status.Live + ")");
    }
}

リポジトリ

// Works fine
public ICollection<Quote> GetAllByStatus(Status status)
{
    using (ISession session = NHibernateHelper.OpenSession())
    {
        var quoteQuery = (from quote in session.Query<Quote>()
                            where quote.Status == (int)status
                            select quote).ToList();

        return quoteQuery;
    }
}

// Dies horribly
public ICollection<Quote> GetListPendingByCompany(Guid companyId, Status status)
{
    using (ISession session = NHibernateHelper.OpenSession())
        return session.GetNamedQuery("QuoteGetListPendingByCompany")
                .SetGuid("Company_Id", companyId)
                .SetInt32("QuoteStatus", (int)status)
                .List<Quote>();
}

SQL

CREATE PROCEDURE [dbo].[QuoteGetListPendingByCompany] 
    @CompanyId uniqueidentifier,
    @QuoteStatus int
AS
BEGIN
    SET NOCOUNT ON;

    SELECT
            Quote.*,
            (
                SELECT 
                        COUNT(*) 
                FROM    QuoteResponse
                WHERE   QuoteResponse.QuoteId = Quote.Id
            ) AS ResponseCount  -- Needs to populate what is currently a formula field
    FROM    Quote
    -- ... code removed
END

StoredProcsMap.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" auto-import="true" assembly="QMP.Data" namespace="QMP.Data.Model">
        <sql-query name="QuoteGetListPendingByCompany" callable="true">
        <return class="QMP.Data.Model.Quote, QMP.Data" />
        <![CDATA[ 
        exec dbo.QuoteGetListPendingByCompany @CompanyId=:Company_Id,@QuoteStatus=:QuoteStatus
        ]]>
    </sql-query>
</hibernate-mapping>
4

2 に答える 2

0

編集後、あなたが何をしようとしているのかわかりましたが、それが可能かどうかはわかりません.SPを呼び出すaFORMULAを使用している場合、列を無視したいですか?NamedQuery

ResultTransformer を指定するとどうなりますか?

return session.GetNamedQuery("QuoteGetListPendingByCompany")
                .SetGuid("Company_Id", companyId)
                .SetInt32("QuoteStatus", (int)status)
                .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Quote)))
                .List<Quote>();
}

私はそれがまだbarfになると思いますが。

于 2013-03-26T12:05:22.793 に答える
0

名前付きクエリに式があるため、流暢なマッピングに式を配置しないでください。

 Map(x => x.ResponseCount).Formula("(SELECT COUNT(*) FROM QuoteResponse WHERE QuoteResponse.QuoteId = Quote.Id and QuoteResponse.Status = " + (int)QuoteResponseRepository.Status.Live + ")");

他のフィールドと同じようにフィールドをマップするだけで問題ありません。

Map(x => x.ResponseCount);
于 2013-03-26T11:00:01.087 に答える