8列の応答を生成するSQLビューがあります。かなり複雑なので、ここではリストしません。また、理解しようとしている問題にあまり追加しません。
このクエリを使用してSQLManagerでビューを直接クエリすると
SELECT * FROM [GPPS].[dbo].[PartIndex]
WHERE CategoryNameId = 182 AND CycleId = 13 AND BasketId = 304 AND MarketId = 8
ORDER BY ProductNameId
(最初の2行が重要です)の期待される結果が得られ、ProductNameId列は結果の7番目です
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
ご覧のとおり、最初の2つのエントリは同一であり、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は何を実行しますか?