【发布时间】:2019-02-07 11:18:57
【问题描述】:
有4张桌子:
上传日期
Id
Description
上传类型
Id
Description
上传状态
Id
Description
上传详情
Id
UploadDateId (FK)
UploadTypeId (FK)
UploadStatusId (FK)
OtherFields..
上传日期 (数据)
1 Aug-2018
2 Sep-2018
3 Oct-2018
4 Nov-2018
5 Dec-2018
6 Jan-2019
UplodeType (数据)
1 Partner
2 Retail
3 Customer
UplodeStatus (数据)
1 Uploaded
2 Processing
3 Successful
UplodeDetail (数据)
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 ...
我正在尝试做的事情是获取所有上传类型
上传成功的月份查询
var list = await _iContext.UploadDate.Where(e => e.UploadDetails.All(o => o.UploadStatusId == (byte)EnumType.UploadStats.Successful)).Distinct().ToListAsync();
所以,从UploadDate 我得到UploadDetails 中的所有条目都成功的地方。它应该给我Aug-2018。但它给了Dec-2018和Jan-2019
我签入了SQL Profiler,它正在生成以下查询...
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)))
基本上过滤掉 NOT 成功的所有内容,从技术上讲,这就是我希望它生成的 reverse,类似于...
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))).
另外,如果我运行上述查询(就在上面,不是EF Core 生成的查询,我会得到Aug-2018,这是预期的结果。
那么,为什么EF Core 生成的查询与我打算写的相反?还是我自己写了一个完全错误的查询?
【问题讨论】:
-
EF Core 生成的查询对于
All运算符是正确的(您的等效于Any并将匹配 [1,2,4])。它给你 [1,5,6],不是吗?问题是包含 5,6?
标签: c# sql-server entity-framework ef-core-2.0