Il y a 4 tables :
UploadDate
Id
Description
UploadType
Id
Description
UploadStatus
Id
Description
UploadDetail
Id
UploadDateId (FK)
UploadTypeId (FK)
UploadStatusId (FK)
OtherFields..
UplodeDate (données)
1 Aug-2018
2 Sep-2018
3 Oct-2018
4 Nov-2018
5 Dec-2018
6 Jan-2019
UplodeType (données)
1 Partner
2 Retail
3 Customer
UplodeStatus (données)
1 Uploaded
2 Processing
3 Successful
UplodeDetail (données)
Id UploadDateId UploadTypeId UploadStatusId other fields
1 1 1 3 ...
2 1 2 3 ...
3 2 2 3 ...
4 2 1 3 ...
5 1 3 3 ...
6 2 3 2 ...
7 3 2 1 ...
8 4 2 1 ...
9 4 2 3 ...
Ce que j'essaye de faire, c'est d'obtenir les mois pour lesquels le téléchargement a réussi. tous les types de téléchargement
La requête
var list = await _iContext.UploadDate.Where(e => e.UploadDetails.All(o => o.UploadStatusId == (byte)EnumType.UploadStats.Successful)).Distinct().ToListAsync();
Donc, de UploadDate
J'obtiens où toutes les entrées dans UploadDetails
ont réussi. Cela devrait me donner Aug-2018
. Mais il donne Dec-2018
y Jan-2019
Je me suis enregistré SQL Profiler
et il génère la requête suivante...
SELECT DISTINCT [e].[Id], [e].[Description]
FROM [UploadDate] AS [e]
WHERE NOT EXISTS (
SELECT 1
FROM [UploadDetail] AS [o]
WHERE ([e].[Id] = [o].[UploadDateId]) AND ([o].[UploadStatusId] <> CAST(3 AS tinyint)))
En fait, je filtre tout ce qui est NOT
réussi, ce qui, techniquement, est le reverse
de ce que je veux qu'il génère, quelque chose comme...
SELECT DISTINCT [e].[Id], [e].[Description]
FROM [UploadDate] AS [e]
WHERE EXISTS (
SELECT 1
FROM [UploadDetail] AS [o]
WHERE ([e].[Id] = [o].[UploadDateId]) AND ([o].[UploadStatusId] = CAST(3 AS tinyint))).
De même, si j'exécute la requête ci-dessus (juste au-dessus, pas celle générée par EF Core
j'obtiens Aug-2018
ce qui est le résultat escompté.
Alors, pourquoi EF Core
générer la requête à l'inverse de ce que j'ai l'intention d'écrire ? ou ai-je écrit une requête totalement erronée ?