小编典典

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

sql

我有一个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做些什么?


阅读 125

收藏
2021-03-23

共1个答案

小编典典

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

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

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

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

2021-03-23