私は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>