2016-05-18 13 views
3

答えを探して何時間も失敗しました。たぶん単純すぎると誰もそれについて話したことがなかった、おそらく私は検索するために適切な用語を使用していない。* OR *と* AND *句を使用して左結合でnHibernate QueryOver

基本的にLEFT JOINテーブルでOR句とAND句を使用する必要があります。そして私はそれをQueryOverでやりたいと思います。

SELECT customer.name, order.id 
    FROM customer 
    LEFT JOIN order ON (order.idcustomer = customer.id) 
WHERE customer.active 
    AND (order.id IS NULL or (order.date >= :p0 AND order.date <= :p1) 

WICHを意味し、すべてのアクティブな顧客とその注文を、しかし、唯一の秩序を作ったことがない人たちや、特定の期間の間の注文を持っている人:結果のSQLは次のようになります。

私はQueryOverに入ったこれに最も近い

されました:

Order order = null; 

var query = session.QueryOver<Customer>() 
    .Left.JoinAlias(x => x.Orders,() => order) 
    .Where(x => x.Active) 
    .And(() => order == null || (order.date >= date1 && order.date <= date2)) 

上記QueryOverが、でも実行される前に、「設定されていないリファレンス」私を与えます。私は、「制限」を使用することについての指示を見つけましたが、ORとANDのtogheterを使用するものはありませんでした。

何か助けていただきありがとうございます。

答えて

2

私はあなたがちょうどあなたのwhere句にorder.Idが欠けていると思う:うん

SELECT 
    this_.Name as y0_, 
    order1_.Id as y1_ 
FROM 
    Customer this_ 
    LEFT OUTER JOIN [Order] order1_ ON this_.Id = order1_.CustomerId 
WHERE 
    this_.Active = @p0 AND (
     order1_.Id IS NULL OR (
      order1_.Date >= @p1 AND order1_.Date <= @p2 
     ) 
    ); 
+0

Order order = null; var query = session.QueryOver<Customer>() .Left.JoinAlias(x => x.Orders,() => order) .Where(x => x.Active) .And(() => order.Id == null || (order.date >= date1 && order.date <= date2)) // -----------------^ 

これは私に次のSQL(SQL Serverを)与えます!できます!私はそれを前に試みましたが、C#コンパイラは "Id"が長いので "order.Id == null"は常にfalseになりますので、woudn'tはうまく動作しないと思っていました。 –

+2

@RogerKiihl:ああ、そうだね。幸いなことに、QueryOverが使用する式は実際には実行時に評価されず、解析されて最終的にSQLに変換されるため、ここで警告の種類を無視することは安全です。 –