指定されたレコードがリクエストのソースに関連するかどうかを判断するNHibernateクエリを作成しようとしています。この場合、指定されたレコードは顧客であり、顧客は指定されたソースから発注された注文があれば関連します。OfTypeとサブクエリを使用したNHibernateクエリ
私は行ったことがありますが、次のクエリはQuerySyntaxException
で失敗します。項目だけを見て
bool IsRelevant = Session.Query<Order>().Where
(
ThisOrder => ThisOrder.Customer.ID == ThisCustomer.ID
&&
ThisOrder.Items.OfType<SourceOrderItem>().Where
(
I => I.Source.ID == Source.ID
).Count() > 0
).Count() > 0;
は、私は問題の少なくとも一部は、SourceOrderItem
がOrderItem
のサブタイプと、そのタイプでない項目が含まれていてもよいためであることだと思うので、クエリがに追加フィルタリングを必要とします正しいタイプのものです。
例外:クエリ
DECLARE @p0 int
DECLARE @p1 int
DECLARE @p2 int
SET @p0 = 1
SET @p1 = 1
SET @p2 = 1
select TOP (@p0)
request0_.ID as ID24_,
request0_.Date as Date24_,
request0_.Delivery as Delivery24_,
request0_.PO as PO24_,
request0_.Discount as Discount24_,
request0_.Notes as Notes24_,
request0_.PaymentType as PaymentT7_24_,
request0_.Transport as Transport24_,
request0_.Customer_id as Customer9_24_,
request0_.Site_id as Site10_24_,
request0_.CreatedBy_id as CreatedBy11_24_,
request0_1_.OrderNumber as OrderNum2_25_,
request0_2_.Revision as Revision26_,
request0_2_.ExpiryDate as ExpiryDate26_,
case
when request0_1_.Request_id is not null then 1
when request0_2_.Request_id is not null then 2
when request0_.ID is not null then 0
end as clazz_
from [Request] request0_
left outer join [Order] request0_1_ on request0_.ID=request0_1_.Request_id
left outer join [Quote] request0_2_ on request0_.ID=request0_2_.Request_id
where
[email protected]
and
(exists
(select
items1_.ID
from
[RequestItem] items1_
where request0_.ID=items1_.Request_id
and case
when items1_2_.ChargeableRequestItem_id is not null then 2
when items1_3_.ChargeableRequestItem_id is not null then 3
when items1_1_.RequestItem_id is not null then 1
when items1_4_.RequestItem_id is not null then 4
when items1_.ID is not null then 0
end=3
and [email protected]))
これを実行しようとする代わりに、SQL例外でWhere().Count > 0
結果のAny
を使用するには、この変更のNHibernateのバージョン3.1.0.4000
を使用して
Exception of type 'Antlr.Runtime.NoViableAltException' was thrown. [.Count[Domain.Order](.Where[Domain.Order](NHibernate.Linq.NhQueryable`1[Domain.Order], Quote((R,) => (AndAlso(Equal(R.Customer.ID, p1), GreaterThan(.Count[Domain.SourceOrderItem](.Where[Domain.SourceOrderItem](.OfType[Domain.SourceOrderItem](R.Items,), (I,) => (Equal(I.Source.ID, p2)),),), p3)))),),)]
2番目のcase文の下にあるテーブルのどれも宣言されていないので、ステートメントからかなり抜けているようです。
今のところ、私は自分自身でSQLを書くことでこの問題を解決しました。
でも、私はまだNHibernateソリューションを好みます。
どのバージョンのNHをお使いですか?また、WhereとCountの代わりにAnyを使用することもできます.OffTypeの代わりにOfTypeの代わりに使用することもできます。 – Nikolay
@Nikolay 3.1.0.4000、これから試してみます –
@Nikolay OfTypeをCountに変更するにはどうすればよいですか? CountはIQueryableを返さず、OfTypeと同じチェックを実行できません。 –