我有一个非常奇怪的问题,下面是一个由控制器调用的服务,它返回不同的结果,而对传递的参数或数据集没有任何更改
因此,例如,在第一次运行中,它向我显示找到的结果为 15,未找到的结果为 25,并且在下一次运行中不更改任何内容的情况下,显示了完全不同的结果,每次我运行代码时,它都会显示不同的结果,而无需更改数据
这是代码
public async Task<List<KeyValuePair<string, double>>> GetTotals(DateTime? startDate, DateTime? endDate, string? parentGroup, string? childGroup, string? location)
{
List<KeyValuePair<string, double>> result = new List<KeyValuePair<string, double>>();
try
{
SqlParameter[] param = StoredProcedureHelpers.GetAsSQLParameters(startDate, endDate, parentGroup, childGroup, location);
string sql = "EXEC MyDb.spGetResult @StartDate, @EndDate, @parentGroup, @childGroup, @Location";
var queryResult = await _context.VwResults.FromSqlRaw(sql, param).AsNoTracking().ToListAsync();
queryResult = queryResult.AsEnumerable()
.Where(x => !string.IsNullOrEmpty(x.Category) &&
x.Category.Trim().ToUpper().Equals("Category1") &&
!string.IsNullOrEmpty(x.FinalResultValue) &&
(x.FinalResultValue.Trim().Equals("Found") || x.FinalResultValue.Trim().Equals("Not Found"))).ToList();
var distinctedList = queryResult.DistinctBy(x => x.TextId);
var totalResutls = distinctedList.Count();
var found = distinctedList.Count(x => x.FinalResultValue?.Trim().ToUpper() == "Found".ToUpper());
var notFound = distinctedList.Count(x => x.FinalResultValue?.Trim().ToUpper() == "Not Found".Trim().ToUpper());
result.Add(new KeyValuePair<string, double>(TOTAL_TEST_RESULTS, totalResutls));
result.Add(new KeyValuePair<string, double>("Found", found));
result.Add(new KeyValuePair<string, double>("Not_Found", notFound));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
return result;
}
更新:
这是我的存储过程查询:
ALTER PROCEDURE [MyDb].[spGetResult]
@StartDate DATE,
@EndDate DATE,
@parentGroup VARCHAR(100) = NULL,
@childGroup VARCHAR(100) = NULL,
@Location VARCHAR(100) = NULL
AS
SET NOCOUNT ON;
SELECT distinct
s.SCode AS SCode,
s.text_id AS Text_ID,
sp.Location,
s.date AS Date,
[dbo].[CASES].[DESCRIPTION] AS childGroup,
t.group_name AS Lab,
[dbo].[CASES].[DESCRIPTION] AS Result1,
a.c_analyte_group AS Category,
a.analysis_type AS parentGroup,
[dbo].[CASES].[DESCRIPTION] AS Final_Result,
r.FORMATTED_ENTRY,
r.C_FINAL_ID_ENTRY AS FinalResult_Value
FROM [dbo].[SAMPLE] AS s
INNER JOIN [dbo].[TEST] AS t ON t.SCode = s.SCode
INNER JOIN [dbo].[RESULT] AS r ON r.test_number = t.test_number
INNER JOIN [dbo].[ANALYSIS] AS a ON a.name = r.analysis
INNER JOIN [dbo].[CASES] on [dbo].[CASES].[NAME] = r.alias_name
WHERE (s.date >= @StartDate AND s.date <= @EndDate)
AND (@parentGroup IS NULL OR t.quot_group LIKE '%'+@parentGroup+'%' OR t.ANALYSIS LIKE '%'+@parentGroup+'%')
AND (@childGroup IS NULL OR [dbo].[CASES].[DESCRIPTION] LIKE '%'+@childGroup+'%')
AND (@Location IS NULL OR sp.location LIKE '%'+@Location+'%')
AND t.group_name = 'CH888'
AND s.template in ( 'YTIO', 'WWWWW')
AND a.active = 'AYT'
AND a.c_analyte_group in ('Category1','Category2')
AND t.status in ('NON Activated');
深入研究代码和数据后,我发现了数据本身的问题,或者更具体地说,问题存在于存储过程中。问题是由于使用“LIKE”运算符进行结果比较,导致发现重复条目。
例如,如果我们同时搜索“ABCDEFG”和“EFG”,“EFG”结果将错误地出现在“ABCDEFG”的结果中,从而在初始检查期间产生重复数据的错觉。为了解决这个问题,我们在存储过程中用“=”替换了“LIKE”运算符。
即使问题并非直接源于代码,我也提供了此解决方案,以防将来有人遇到类似的问题。