@@ -21,7 +21,7 @@ protected override string[] Mappings
2121 return new string [ ]
2222 {
2323 "CompositeId.Customer.hbm.xml" , "CompositeId.Order.hbm.xml" , "CompositeId.LineItem.hbm.xml" ,
24- "CompositeId.Product.hbm.xml"
24+ "CompositeId.Product.hbm.xml" , "CompositeId.Shipper.hbm.xml"
2525 } ;
2626 }
2727 }
@@ -64,9 +64,13 @@ public void CompositeIds()
6464
6565 Order o = new Order ( c ) ;
6666 o . OrderDate = DateTime . Today ;
67+ o . Shipper = new Shipper ( ) { Id = new NullableId ( null , 13 ) } ;
68+ s . Persist ( o ) ;
69+
6770 LineItem li = new LineItem ( o , p ) ;
6871 li . Quantity = 2 ;
69-
72+ s . Persist ( li ) ;
73+
7074 t . Commit ( ) ;
7175 }
7276
@@ -123,6 +127,19 @@ public void CompositeIds()
123127 t . Commit ( ) ;
124128 }
125129
130+ using ( s = OpenSession ( ) )
131+ {
132+ t = s . BeginTransaction ( ) ;
133+ var noShippersForWarehouse = s . Query < Order > ( )
134+ // NOTE: .Where(x => x.Shipper.Id == new NullableId(null, 13)) improperly renders
135+ // "where (ShipperId = @p1 and WarehouseId = @p2)" with @p1 = NULL (needs to be is null)
136+ // But the effort to fix is pretty high due to how component tuples are managed in linq / hql.
137+ . Where ( x => x . Shipper . Id . WarehouseId == 13 && x . Shipper . Id . Id == null )
138+ . ToList ( ) ;
139+ Assert . AreEqual ( 1 , noShippersForWarehouse . Count ) ;
140+ t . Commit ( ) ;
141+ }
142+
126143 using ( s = OpenSession ( ) )
127144 {
128145 t = s . BeginTransaction ( ) ;
@@ -291,5 +308,14 @@ public void AnyOnCompositeId()
291308 s . Query < Order > ( ) . Select ( o => o . LineItems . Any ( ) ) . ToList ( ) ;
292309 }
293310 }
311+
312+ public void NullCompositeId ( )
313+ {
314+ using ( var s = OpenSession ( ) )
315+ {
316+ s . Query < Order > ( ) . Where ( o => o . LineItems . Any ( ) ) . ToList ( ) ;
317+ s . Query < Order > ( ) . Select ( o => o . LineItems . Any ( ) ) . ToList ( ) ;
318+ }
319+ }
294320 }
295321}
0 commit comments