Skip to content

Feat - extending decompilation to referenced queries #215

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:36
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:49

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework v6.1](http://msdn.microsoft.com/en-us/data/aa937723) (EF).
Expand Down Expand Up @@ -147,7 +147,10 @@ More will appear as we move forward.*
### Group: Additional Features
#### [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs):
- Supported
* Subquery As Context Extension Method (line 68)
* Subquery As Context Extension Method (line 69)
* Filter With Subquery Reference (line 112)
- **Not Supported**
* Subquery As Variable Reference (line 82)



Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail With Sql of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:36
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:49

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework v6.1](http://msdn.microsoft.com/en-us/data/aa937723) (EF).
Expand Down Expand Up @@ -849,7 +849,7 @@ SELECT
### Group: Additional Features
#### [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs):
- Supported
* Subquery As Context Extension Method (line 68)
* Subquery As Context Extension Method (line 69)
* T-Sql executed is

```SQL
Expand All @@ -874,6 +874,32 @@ SELECT
) AS [Project4]
```

* Filter With Subquery Reference (line 112)
* T-Sql executed is

```SQL
SELECT
CASE WHEN ( EXISTS (SELECT
1 AS [C1]
FROM [dbo].[EfParents] AS [Extent1]
WHERE EXISTS (SELECT
1 AS [C1]
FROM ( SELECT
[Extent2].[EfParentId] AS [EfParentId],
(SELECT
COUNT(1) AS [A1]
FROM [dbo].[EfChilds] AS [Extent3]
WHERE [Extent2].[EfParentId] = [Extent3].[EfParentId]) AS [C1]
FROM [dbo].[EfParents] AS [Extent2]
) AS [Project1]
WHERE (0 = [Project1].[C1]) AND ([Project1].[EfParentId] = [Extent1].[EfParentId])
)
)) THEN cast(1 as bit) ELSE cast(0 as bit) END AS [C1]
FROM ( SELECT 1 AS X ) AS [SingleRowTable1]
```

- **Not Supported**
* Subquery As Variable Reference (line 82)



Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Summary of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:36
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:49

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework v6.1](http://msdn.microsoft.com/en-us/data/aa937723) (EF).
Expand Down Expand Up @@ -55,8 +55,8 @@ More will appear as we move forward.*
* [DateTime](../TestGroup50Types/Test05DateTime.cs) (1 tests)

### Group: Additional Features
- Supported
* [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs) (1 tests)
- **Partially Supported**
* [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs) (2 of 3 tests passed)


The End
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
using System.Linq;
using System;
using System.Linq;
using DelegateDecompiler.EntityFramework.Tests.EfItems;
using DelegateDecompiler.EntityFramework.Tests.EfItems.Abstracts;
using DelegateDecompiler.EntityFramework.Tests.Helpers;
using NUnit.Framework;

Expand Down Expand Up @@ -68,5 +70,73 @@ public void TestSubqueryAsContextExtensionMethod()
env.CompareAndLogList(linq, dd);
}
}

[Test]
#if EF_CORE && !EF_CORE3 && !EF_CORE5
[Ignore("Not natively supported in EF_CORE < 3")]
#endif
public void TestFailingSubqueryAsVariableReference()
{
using (var env = new MethodEnvironment(classEnv))
{
//ATTEMPT
env.AboutToUseDelegateDecompiler();
var referencedQuery = env.Db.Set<Animal>().Where(it => it.Species == "Canis lupus");
var query = env.Db.Set<Person>().Where(it => it.Animals.Intersect(referencedQuery).Any()).Decompile();

//VERIFY
#if EF_CORE
Assert.Throws<InvalidOperationException>(() => query.ToList());
#else
Assert.Throws<NotSupportedException>(() => query.ToList());
#endif
}
}

[Test]
#if EF_CORE && !EF_CORE3 && !EF_CORE5
[Ignore("Not natively supported in EF_CORE < 3")]
#endif
public void TestSubqueryAsVariableReference()
{
using (var env = new MethodEnvironment(classEnv))
{
//SETUP
var linq = env.Db.Set<Person>().Where(it => it.Animals.Intersect(env.Db.Set<Animal>().Where(a => a is Dog)).Any())
.ToList();

//ATTEMPT
env.AboutToUseDelegateDecompiler();
var referencedQuery = env.Db.Set<Animal>().Where(it => it.Species == "Canis lupus").Decompile();
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add test where the query would not be decompiled

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @hazzik, got a bit sidetracked.
I'm not sure I understand what test you want added here, so I added one failing test to expose the issue and refactored the other to compare materialized results

var query = env.Db.Set<Person>().Where(it => it.Animals.Intersect(referencedQuery).Any()).Decompile();


var list = query.ToList();

//VERIFY
env.CompareAndLogList(linq, list);
}
}

[Test]
#if EF_CORE && !EF_CORE3 && !EF_CORE5
[Ignore("Not natively supported in EF_CORE < 3")]
#endif
public void TestFilterWithSubqueryReference()
{
using (var env = new MethodEnvironment(classEnv))
{
//SETUP
var linq = env.Db.EfParents.Any(x => env.Db.EfParents.Where(p => p.Children.Count() == 0).Contains(x));

//ATTEMPT
env.AboutToUseDelegateDecompiler();
var referencedQuery = env.Db.EfParents.Where(p => p.CountChildren == 0).Decompile();
var dd = env.Db.EfParents.Decompile().Any(x => referencedQuery.Contains(x));

//VERIFY
env.CompareAndLogSingleton(linq, dd);
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public override IQueryable CreateQuery(Expression expression)

public override IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return new AsyncDecompiledQueryable<TElement>(this, inner.CreateQuery<TElement>(decompiled));
}

Expand All @@ -54,7 +54,7 @@ public Task<object> ExecuteAsync(Expression expression, CancellationToken cancel
{
throw new InvalidOperationException("The source IQueryProvider doesn't implement IDbAsyncQueryProvider.");
}
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return asyncProvider.ExecuteAsync(decompiled, cancellationToken);
}

Expand All @@ -65,7 +65,7 @@ public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationTo
{
throw new InvalidOperationException("The source IQueryProvider doesn't implement IDbAsyncQueryProvider.");
}
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return asyncProvider.ExecuteAsync<TResult>(decompiled, cancellationToken);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:41

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail With Sql of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:41

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Summary of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:41

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ protected IAsyncQueryProvider AsyncQueryProvider
// ReSharper disable once VirtualMemberNeverOverridden.Global
public virtual TResult ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return (TResult)MethodCache<TResult>.ExecuteAsync(AsyncQueryProvider, decompiled, cancellationToken);
}

Expand Down Expand Up @@ -95,19 +95,19 @@ public AsyncDecompiledQueryProvider(IQueryProvider inner)

public override IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return new EntityQueryable<TElement>(this, decompiled);
}

public virtual IAsyncEnumerable<TResult> ExecuteAsync<TResult>(Expression expression)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return (IAsyncEnumerable<TResult>)MethodCache<TResult>.ExecuteAsync(AsyncQueryProvider, decompiled);
}

public new virtual Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return (Task<TResult>)MethodCache<TResult>.ExecuteAsync(AsyncQueryProvider, decompiled, cancellationToken);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:42

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down Expand Up @@ -146,7 +146,10 @@ More will appear as we move forward.*
### Group: Additional Features
#### [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs):
- Supported
* Subquery As Context Extension Method (line 68)
* Subquery As Context Extension Method (line 69)
* Filter With Subquery Reference (line 112)
- **Not Supported**
* Subquery As Variable Reference (line 82)



Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail With Sql of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:42

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down Expand Up @@ -506,13 +506,22 @@ More will appear as we move forward.*
### Group: Additional Features
#### [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs):
- Supported
* Subquery As Context Extension Method (line 68)
* Subquery As Context Extension Method (line 69)
* T-Sql executed is

```SQL

```

* Filter With Subquery Reference (line 112)
* T-Sql executed is

```SQL

```

- **Not Supported**
* Subquery As Variable Reference (line 82)



Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Summary of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:42

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down Expand Up @@ -55,8 +55,8 @@ More will appear as we move forward.*
* [DateTime](../TestGroup50Types/Test05DateTime.cs) (1 tests)

### Group: Additional Features
- Supported
* [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs) (1 tests)
- **Partially Supported**
* [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs) (2 of 3 tests passed)


The End
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,14 @@ IAsyncQueryProvider AsyncQueryProvider

public virtual TResult ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return AsyncQueryProvider.ExecuteAsync<TResult>(decompiled, cancellationToken);
}

[SuppressMessage("EntityFramework", "EF1001")]
public override IQueryable<TElement> CreateQuery<TElement>(Expression expression)
{
var decompiled = expression.Decompile();
var decompiled = expression.Decompile().Optimize();
return new EntityQueryable<TElement>(this, decompiled);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Detail of supported commands
============
## Documentation produced for DelegateDecompiler, version 0.32.1.0 on Tuesday, 25 October 2022 19:37
## Documentation produced for DelegateDecompiler, version 0.33.0.0 on Wednesday, 26 October 2022 12:42

This file documents what linq commands **DelegateDecompiler** supports when
working with [Entity Framework Core](https://docs.microsoft.com/en-us/ef/core/) (EF).
Expand Down Expand Up @@ -146,7 +146,10 @@ More will appear as we move forward.*
### Group: Additional Features
#### [Nested Expressions](../TestGroup90AdditionalFeatures/Test01NestedExpressions.cs):
- Supported
* Subquery As Context Extension Method (line 68)
* Subquery As Context Extension Method (line 69)
* Filter With Subquery Reference (line 112)
- **Not Supported**
* Subquery As Variable Reference (line 82)



Expand Down
Loading