我有一个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中按预期工作