Query: optimize query sql patterns like `(x || y) && !y` into `x && !y` when y is non-nullable
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
Research direction
Start by reproducing the C# example with the SQL Server provider and inspect the LINQ translation used by ToQueryString(). Add a regression test for the non-nullable boolean pattern, and consider the work done when the generated SQL removes the redundant OR/IS NULL branch and matches the expected behavior.
Written by the indexing model from the issue text.
Description
Include your code
public class Test
{
public Guid Id { get; set; }
public Guid? UserId { get; set; }
}
public partial class DemoContext : DbContext
{
public DemoContext()
{
}
public DemoContext(DbContextOptions<DemoContext> options)
: base(options)
{
}
public virtual DbSet<Test> Tests { get; set; }
}
var services = new ServiceCollection();
services.AddDbContext<DemoContext>();
var serviceProvider = services.BuildServiceProvider();
var demoContext = serviceProvider.GetRequiredService<DemoContext>();
var userId = Guid.NewGuid();
var sql = demoContext.Tests.Where(a => a.UserId != userId && a.UserId.HasValue).ToQueryString();
Console.WriteLine(sql);
Expected Behavior
DECLARE @__userId_0 uniqueIdentifier = 'd7deb76b-b725-4285-a736-2477dedb927b';
SELECT [t].[Id], [t].[UserId]
FROM [Tests] AS [t]
WHERE [t].[UserId] IS NOT NULL AND ([t].[UserId] <> @__userId_0)
Actual Behavior
DECLARE @__userId_0 uniqueIdentifier = '8286edc4-2a82-49d7-b50c-1832964b94e5';
SELECT [t].[Id], [t].[UserId]
FROM [Tests] AS [t]
WHERE (([t].[UserId] <> @__userId_0) OR [t].[UserId] IS NULL) AND [t].[UserId] IS NOT NULL
Include provider and version information
EF Core version:6.0.0-rc.1.21452.10
Database provider: Microsoft.EntityFrameworkCore.SqlServer
Target framework: .NET 6.0
Operating system:Win10
IDE: Visual Studio 2022 17.0
- Dominant language
- C#
- Stars
- 14.8k
- Forks
- 3.4k
- Avg merge
- 2d 5h
- Merged PRs (30d)
- 134
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from dotnet/efcore
-
Difficulty 4/5 3-5 days Newbie friendliness 55/100
-
customer-reported
Difficulty 5/5 Over a week Newbie friendliness 38/100
-
area-cosmos area-vector-search
Difficulty 5/5 Over a week Newbie friendliness 25/100
-
area-cosmos
Difficulty 5/5 Over a week Newbie friendliness 25/100
-
area-tools needs-design
Difficulty 4/5 3-5 days Newbie friendliness 25/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Difficulty 2/5 1-3 hours Newbie friendliness 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SubtitleEdit/subtitleedit#15108 · 1 comment ·
-
area/docs-content Bug pulumi/docs
Difficulty 1/5 1-3 hours Newbie friendliness 94/100
-
agentic-workflows untriaged
Difficulty 2/5 1-3 hours Newbie friendliness 76/100