@@ -3523,12 +3523,7 @@ public void Include_with_order_by_on_interface_key()
3523
3523
{
3524
3524
using ( var context = new MyContext10635 ( _options ) )
3525
3525
{
3526
- Assert . Equal (
3527
- CoreStrings . TranslationFailed ( "(p) => ((IEntity10635)p).Id" ) ,
3528
- Assert . Throws < InvalidOperationException > (
3529
- ( ) => context . Parents . Include ( p => p . Children ) . OrderBy ( p => ( ( IEntity10635 ) p ) . Id ) . ToList ( ) ) . Message ) ;
3530
-
3531
- var query2 = context . Parents . Include ( p => p . Children ) . OrderBy ( p => EF . Property < int > ( p , "Id" ) ) . ToList ( ) ;
3526
+ var query = context . Parents . Include ( p => p . Children ) . OrderBy ( p => ( ( IEntity10635 ) p ) . Id ) . ToList ( ) ;
3532
3527
3533
3528
AssertSql (
3534
3529
@"SELECT [p].[Id], [p].[Name], [c].[Id], [c].[Name], [c].[Parent10635Id], [c].[ParentId]
@@ -3546,12 +3541,7 @@ public void Correlated_collection_with_order_by_on_interface_key()
3546
3541
{
3547
3542
using ( var context = new MyContext10635 ( _options ) )
3548
3543
{
3549
- Assert . Equal (
3550
- CoreStrings . TranslationFailed ( "(p) => ((IEntity10635)p).Id" ) ,
3551
- Assert . Throws < InvalidOperationException > (
3552
- ( ) => context . Parents . OrderBy ( p => ( ( IEntity10635 ) p ) . Id ) . Select ( p => p . Children . ToList ( ) ) . ToList ( ) ) . Message ) ;
3553
-
3554
- var query2 = context . Parents . OrderBy ( p => EF . Property < int > ( p , "Id" ) ) . Select ( p => p . Children . ToList ( ) ) . ToList ( ) ;
3544
+ var query = context . Parents . OrderBy ( p => ( ( IEntity10635 ) p ) . Id ) . Select ( p => p . Children . ToList ( ) ) . ToList ( ) ;
3555
3545
3556
3546
AssertSql (
3557
3547
@"SELECT [p].[Id], [c].[Id], [c].[Name], [c].[Parent10635Id], [c].[ParentId]
@@ -6330,6 +6320,134 @@ public class EntityWithQueryFilterCycle3
6330
6320
6331
6321
#endregion
6332
6322
6323
+ #region Bug17276_17099_16759
6324
+
6325
+ [ ConditionalFact ]
6326
+ public virtual void Expression_tree_constructed_via_interface_works_17276 ( )
6327
+ {
6328
+ using ( CreateDatabase17276 ( ) )
6329
+ {
6330
+ using ( var context = new MyContext17276 ( _options ) )
6331
+ {
6332
+ var query = List17276 ( context . RemovableEntities ) ;
6333
+
6334
+ AssertSql (
6335
+ @"SELECT [r].[Id], [r].[IsRemoved], [r].[Removed], [r].[RemovedByUser]
6336
+ FROM [RemovableEntities] AS [r]
6337
+ WHERE [r].[IsRemoved] <> CAST(1 AS bit)" ) ;
6338
+ }
6339
+ }
6340
+ }
6341
+
6342
+ [ ConditionalFact ]
6343
+ public virtual void Expression_tree_constructed_via_interface_for_navigation_works_17099 ( )
6344
+ {
6345
+ using ( CreateDatabase17276 ( ) )
6346
+ {
6347
+ using ( var context = new MyContext17276 ( _options ) )
6348
+ {
6349
+ var query = context . Parents
6350
+ . Where ( p => EF . Property < bool > ( EF . Property < IRemovable17276 > ( p , "RemovableEntity" ) , "IsRemoved" ) )
6351
+ . ToList ( ) ;
6352
+
6353
+ AssertSql (
6354
+ @"SELECT [p].[Id], [p].[RemovableEntityId]
6355
+ FROM [Parents] AS [p]
6356
+ LEFT JOIN [RemovableEntities] AS [r] ON [p].[RemovableEntityId] = [r].[Id]
6357
+ WHERE [r].[IsRemoved] = CAST(1 AS bit)" ) ;
6358
+ }
6359
+ }
6360
+ }
6361
+
6362
+ [ ConditionalFact ]
6363
+ public virtual void Expression_tree_constructed_via_interface_works_16759 ( )
6364
+ {
6365
+ using ( CreateDatabase17276 ( ) )
6366
+ {
6367
+ using ( var context = new MyContext17276 ( _options ) )
6368
+ {
6369
+ var specification = new Specification17276 < Parent17276 > ( 1 ) ;
6370
+ var entities = context . Set < Parent17276 > ( ) . Where ( specification . Criteria ) . ToList ( ) ;
6371
+
6372
+ AssertSql (
6373
+ @"@__id_0='1'
6374
+
6375
+ SELECT [p].[Id], [p].[RemovableEntityId]
6376
+ FROM [Parents] AS [p]
6377
+ WHERE ([p].[Id] = @__id_0) AND @__id_0 IS NOT NULL" ) ;
6378
+ }
6379
+ }
6380
+ }
6381
+
6382
+ public class MyContext17276 : DbContext
6383
+ {
6384
+ public DbSet < RemovableEntity17276 > RemovableEntities { get ; set ; }
6385
+ public DbSet < Parent17276 > Parents { get ; set ; }
6386
+ public MyContext17276 ( DbContextOptions options ) : base ( options )
6387
+ {
6388
+ }
6389
+
6390
+ protected override void OnModelCreating ( ModelBuilder modelBuilder )
6391
+ {
6392
+ }
6393
+ }
6394
+
6395
+ private SqlServerTestStore CreateDatabase17276 ( )
6396
+ => CreateTestStore (
6397
+ ( ) => new MyContext17276 ( _options ) ,
6398
+ context =>
6399
+ {
6400
+ context . SaveChanges ( ) ;
6401
+
6402
+ ClearLog ( ) ;
6403
+ } ) ;
6404
+
6405
+ public static List < T > List17276 < T > ( IQueryable < T > query ) where T : IRemovable17276
6406
+ {
6407
+ return query . Where ( x => ! x . IsRemoved ) . ToList ( ) ;
6408
+ }
6409
+
6410
+ public interface IRemovable17276
6411
+ {
6412
+ bool IsRemoved { get ; set ; }
6413
+
6414
+ string RemovedByUser { get ; set ; }
6415
+
6416
+ DateTime ? Removed { get ; set ; }
6417
+ }
6418
+
6419
+ public class RemovableEntity17276 : IRemovable17276
6420
+ {
6421
+ public int Id { get ; set ; }
6422
+ public bool IsRemoved { get ; set ; }
6423
+ public string RemovedByUser { get ; set ; }
6424
+ public DateTime ? Removed { get ; set ; }
6425
+ }
6426
+
6427
+ public class Parent17276 : IHasId17276 < int >
6428
+ {
6429
+ public int Id { get ; set ; }
6430
+ public RemovableEntity17276 RemovableEntity { get ; set ; }
6431
+ }
6432
+
6433
+ public interface IHasId17276 < out T >
6434
+ {
6435
+ T Id { get ; }
6436
+ }
6437
+
6438
+ public class Specification17276 < T >
6439
+ where T : IHasId17276 < int >
6440
+ {
6441
+ public Expression < Func < T , bool > > Criteria { get ; }
6442
+
6443
+ public Specification17276 ( int id )
6444
+ {
6445
+ Criteria = t => t . Id == id ;
6446
+ }
6447
+ }
6448
+
6449
+ #endregion
6450
+
6333
6451
private DbContextOptions _options ;
6334
6452
6335
6453
private SqlServerTestStore CreateTestStore < TContext > (
0 commit comments