有4个表:
上传日期
Id
Description
上传类型
Id
Description
上传状态
Id
Description
上传详情
Id
UploadDateId (FK)
UploadTypeId (FK)
UploadStatusId (FK)
OtherFields..
上传日期 (data)
1 Aug-2018
2 Sep-2018
3 Oct-2018
4 Nov-2018
5 Dec-2018
6 Jan-2019
上传类型 (data)
1 Partner
2 Retail
3 Customer
上传状态 (数据)
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)))
基本上是要过滤掉所有未成功的内容,这技术上与我所需生成的相反,类似于...
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
生成的查询与我打算编写的相反呢?或者我已经编写了完全错误的查询语句吗?
All
运算符是正确的(您的等价于Any
并将匹配[1,2,4])。它给出了[1,5,6],不是吗?问题在于包含了5,6吗? - Ivan Stoev