每次运行时具有相同数据集和不同结果的相同 EF Core 查询

问题描述 投票:0回答:1

我有一个非常奇怪的问题,下面是一个由控制器调用的服务,它返回不同的结果,而对传递的参数或数据集没有任何更改

因此,例如,在第一次运行中,它向我显示找到的结果为 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'); 
c# linq .net-core entity-framework-core asp.net-core-6.0
1个回答
0
投票

深入研究代码和数据后,我发现了数据本身的问题,或者更具体地说,问题存在于存储过程中。问题是由于使用“LIKE”运算符进行结果比较,导致发现重复条目。

例如,如果我们同时搜索“ABCDEFG”和“EFG”,“EFG”结果将错误地出现在“ABCDEFG”的结果中,从而在初始检查期间产生重复数据的错觉。为了解决这个问题,我们在存储过程中用“=”替换了“LIKE”运算符。

即使问题并非直接源于代码,我也提供了此解决方案,以防将来有人遇到类似的问题。

© www.soinside.com 2019 - 2024. All rights reserved.