当前位置: 首页 > 面试题库 >

在SQL视图上的LINQ选择得到错误的答案

艾泉
2023-03-14
问题内容

我有一个SQL视图,它产生一个包含8列的响应。这是一个相当复杂的工作,因此我不会在这里列出它,也不会增加我要理解的问题。

当我直接使用此查询在SQL Manager中查询视图时

SELECT * FROM [GPPS].[dbo].[PartIndex]
WHERE CategoryNameId = 182 AND CycleId = 13 AND BasketId = 304 AND MarketId = 8
ORDER BY ProductNameId

我得到了预期的结果(前两行很重要),并且ProductNameId列在结果中排​​在第七位

                            vvvvv
                            =====   
218   13    8   304 182 124 32575   162.84
218   13    8   304 182 124 32576   184.08
218   13    8   304 182 125 32577   156.13
218   13    8   304 182 127 32578   605.84
218   13    8   304 182 130 32579   141.51

当我对视图执行以下LINQ时

PartIndexes.Where(x => x.CategoryNameId == 182 
                       && x.CycleId == 13 
                       && x.BasketId == 304 
                       && x.MarketId == 8)
           .ToList()
           .OrderBy(x => x.ProductNameId);

我实际上得到的是:

                            vvvvv
                            ===== 
218   13    8   304 182 124 32576   184.08
218   13    8   304 182 124 32576   184.08
218   13    8   304 182 125 32577   156.13
218   13    8   304 182 127 32578   605.84
218   13    8   304 182 130 32579   141.51

如您所见,前两个条目相同,并且ID的区别(32575和32576)已经丢失。

在视图上运行LINQ查询时查看SQL事件探查器将产生以下SQL

SELECT 
[Extent1].[SetNameId] AS [SetNameId], 
[Extent1].[CycleId] AS [CycleId], 
[Extent1].[MarketId] AS [MarketId], 
[Extent1].[BasketId] AS [BasketId], 
[Extent1].[CategoryNameId] AS [CategoryNameId], 
[Extent1].[ProductNameId] AS [ProductNameId], 
[Extent1].[PartId] AS [PartId], 
[Extent1].[Total] AS [Total]
FROM (SELECT 
  [PartIndex].[SetNameId] AS [SetNameId], 
  [PartIndex].[CycleId] AS [CycleId], 
  [PartIndex].[MarketId] AS [MarketId], 
  [PartIndex].[BasketId] AS [BasketId], 
  [PartIndex].[CategoryNameId] AS [CategoryNameId], 
  [PartIndex].[ProductNameId] AS [ProductNameId], 
  [PartIndex].[PartId] AS [PartId], 
  [PartIndex].[Total] AS [Total]
  FROM [dbo].[PartIndex] AS [PartIndex]) AS [Extent1]
WHERE (182 = [Extent1].[CategoryNameId]) AND (13 = [Extent1].[CycleId]) AND (304 =  [Extent1].[BasketId]) AND (8 = [Extent1].[MarketId])

当我直接在SQL管理器中执行该命令时,将得到以下期望的结果:

218   13    8   304 182 124 32575   162.84
218   13    8   304 182 124 32576   184.08
218   13    8   304 182 125 32577   156.13
218   13    8   304 182 127 32578   605.84
218   13    8   304 182 130 32579   141.51

任何人都知道这里可能发生什么,为什么执行LINQ请求返回的结果与SQL中的结果不同,但是当执行LINQ查询生成的SQL时,它返回期望的结果?

直接使用时,LINQ无法正常使用时,SQL会直接使用SQL做些什么?


问题答案:

实际上,来自@stanke的问题使我有了一个主意。

实际上,我稍稍更改了视图以包括另一列,以便可以唯一地标识每个记录。

我实际上不需要结果表中的column值,但它确实有助于LINQ在查询时保持记录唯一。看起来SQL本身可以很好地完成此任务,但是LINQ需要一些帮助来保持记录的清晰。

现在,它可以在SQL和LINQ中按预期工作



 类似资料:
  • 在一条数字线上有n个位于不同位置的信标。第i个信标具有位置Ai和功率电平Bi。当第i个信标被激活时,它摧毁其左侧(坐标递减方向)距离bi(含)内的所有信标。然而,信标本身并没有被摧毁。埼玉县将从右至左一个一个地启动信标。如果一个信标被破坏,它就不能被激活。 埼玉希望Genos在所有现有信标的右边严格地添加一个信标,具有任何位置和任何功率等级,这样尽可能少的信标被破坏。注意,Genos放置的信标意味

  • 问题内容: 我试图以与从中选择类似的方式选择的列名称。 我似乎找不到解决办法。有没有其他人以前做过此事,或者知道是否有可能? 问题答案: information_schema.columns.Table_name(至少在Sql Server 2000下)包含视图,因此只需使用

  • 问题内容: 我有一些LINQ to SQL,有时会抛出一个 “无法在具有唯一索引’IX_Indexname’的对象’dbo.Table’中插入重复的键行。该语句已终止。” 有什么办法可以打开日志记录或至少调试到datacontext中,以查看在引发错误时正在执行什么sql? 更新: 我应该提一下我对方法的了解,我想知道在DataContext上是否有一个属性,该属性可以显示最后执行的SQL,或者在

  • 问题内容: 以下脚本应返回部门的名称以及这些部门中的雇员人数,市场营销,执行和销售部门的雇员为‘0’,但返回的值为‘1’,而不是‘0’。我该如何纠正? 问题答案: 不要使用数数您想数数的员工。 计算整行。由于在进行计数(*)时,部门中每个部门始终至少会有一个记录,因此您总是会获得至少1条记录 演示

  • 我正在尝试使用spark sql运行一个基本的java程序 如果有人能给我指出一些在斯巴克-sql(斯巴克-2.1.1)上可以阅读的好材料,那也太好了。我计划使用火花来实现ETL,连接到MySQL和其他数据源。 异常在线程"main"org.apache.spark.sql.分析异常:未找到表或视图:;第1行pos 21;

  • 我用vscode写了一个java程序。但是我在java输出中得到了意想不到的答案。通常这个sout应该是6.6,但是java说6.6000000000000005。为什么