Query: invalid SQL produced for queries with navigation inside predicate of SelectMany-Where-DefaultIfEmpty() pattern
See original GitHub issueSo I have this query with two LEFT JOINS. Everything worked as expected when I had only one LEFT JOIN.
var dbQuery = from i in context.Ingredients
from ii in i.CombinationIngredients.Where(ci => ci.IngredientId == forIngredientId).DefaultIfEmpty()
select new
{
i.Id,
i.Name,
Linked = ii != null
};
However, when I add a second LEFT JOIN I see multiple queries in the database and I get an Exception.
var dbQuery = from i in context.Ingredients
from ii in i.CombinationIngredients.Where(ci => ci.IngredientId == forIngredientId).DefaultIfEmpty()
from t in i.Translations.Where(l => l.Language.Iso639_1 == language).DefaultIfEmpty()
select new
{
i.Id,
i.Name,
t.Translation,
Linked = ii != null
};
I add a Skip(…).Take(100) elsewhere in my code, but one of the queries is a “SELECT [all columns] FROM Ingredient” making this a HUGE performance hit! But, what’s even worse is that it doesn’t work AT ALL.
Notice how I added t.Translation to the return value? I get the error “System.Data.SqlClient.SqlException: ‘Invalid column name ‘Translation’.’” EF somehow figures out that the column Translation is part of the Language table, while it’s part of the IngredientTranslation table (which is what i.Translations points to). One of the generated queries:
SELECT [i.Translations_groupItem.Language0].[Id], [i.Translations_groupItem.Language0].[Iso639_1], [i.Translations_groupItem.Language0].[Translation]
FROM [Language] AS [i.Translations_groupItem.Language0]
I do have a workaround, which is to just write the full join.
var dbQuery = from i in context.Ingredients
from ii in i.CombinationIngredients.Where(ci => ci.IngredientId == forIngredientId).DefaultIfEmpty()
join tran in context.IngredientTranslations.Where(l => l.Language.Iso639_1 == language) on i.Id equals tran.IngredientId into tranGroup
from t in tranGroup.DefaultIfEmpty()
select new
{
i.Id,
i.Name,
t.Translation,
Linked = ii != null
};
I’d prefer to use the much shorter “from x in …” syntax though. I know this works in the non-core EF version.
Further technical details
EF Core version: 2.1.0-preview1-final Database Provider: Microsoft.EntityFrameworkCore.SqlServer Operating system: Windows 10 IDE: Visual Studio 2017 15.6.7
Issue Analytics
- State:
- Created 5 years ago
- Comments:10 (8 by maintainers)
EFCore was written from scratch so it usually doesn’t share issues with EF6. We will definitely fix this - navigation inside predicate of the LEFT JOIN pattern is a compelling scenario so it should work. However at this point we only accept critical issues and regressions for the 2.1 release, so the fix will most likely land after 2.1 has shipped.
Simplified repro: