2012-04-17 7 views
0

指定されたレコードがリクエストのソースに関連するかどうかを判断する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; 

は、私は問題の少なくとも一部は、SourceOrderItemOrderItemのサブタイプと、そのタイプでない項目が含まれていてもよいためであることだと思うので、クエリがに追加フィルタリングを必要とします正しいタイプのものです。

例外:クエリ

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ソリューションを好みます。

+0

どのバージョンのNHをお使いですか?また、WhereとCountの代わりにAnyを使用することもできます.OffTypeの代わりにOfTypeの代わりに使用することもできます。 – Nikolay

+0

@Nikolay 3.1.0.4000、これから試してみます –

+0

@Nikolay OfTypeをCountに変更するにはどうすればよいですか? CountはIQueryableを返さず、OfTypeと同じチェックを実行できません。 –

答えて

0

Nhibernateのクエリを に分割することでこれを行うことができます。

var Items = Session.Query<SourceOrderItem>().Where(I=> I.Source.ID == Source.ID).ToList(); 
foreach(var Item in Items) 
{ 
    IsRelevant = Session.Query<Order>().Any(R => R.Customer.ID == C.ID && R.Items.Any(I => I.ID == Item.ID)); 
    if (IsRelevant) 
     break; 
} 
関連する問題