Code First を使用していて、ストアド プロシージャを呼び出して、クラスの 1 つにマップしようとしています。コンポーネントの詳細を、PartsPath と MyPath の階層情報とともに返すストアド プロシージャ BOMComponentChild を作成しました。このストアド プロシージャの出力用のクラスがあります。PartsPath と MyPath の 2 つの列を除くすべてが正しくマップされ、これら 2 つのプロパティが Nothing になるという問題があります。私は周りを検索し、私の理解から、マッピングはEntity Framework名のマッピングをバイパスし、列名をプロパティ名に使用します。名前は同じで、なぜこの 2 つの列だけなのかわかりません。
ストアド プロシージャの最後の部分は次のとおりです。
SELECT t.ParentID
,t.ComponentID
,c.PartNumber
,t.PartsPath
,t.MyPath
,t.Layer
,c.[Description]
,loc.LocationID
,loc.LocationName
,CASE WHEN sup.SupplierID IS NULL THEN 1 ELSE sup.SupplierID END AS SupplierID
,CASE WHEN sup.SupplierName IS NULL THEN 'Default' ELSE sup.SupplierName END AS SupplierName
,c.Active
,c.QA
,c.IsAssembly
,c.IsPurchasable
,c.IsMachined
,t.QtyRequired
,t.TotalQty
FROM BuildProducts t
INNER JOIN [dbo].[BOMComponent] c ON c.ComponentID = t.ComponentID
LEFT JOIN [dbo].[BOMSupplier] bsup ON bsup.ComponentID = t.ComponentID AND bsup.IsDefault = 1
LEFT JOIN [dbo].[LookupSupplier] sup ON sup.SupplierID = bsup.SupplierID
LEFT JOIN [dbo].[LookupLocation] loc ON loc.LocationID = c.LocationID
WHERE
(@IsAssembly IS NULL OR IsAssembly = @IsAssembly)
ORDER BY
t.MyPath
マップ先のクラスは次のとおりです。
Public Class BOMComponentChild
Public Property ParentID As Nullable(Of Integer)
Public Property ComponentID As Integer
Public Property PartNumber As String
Public Property MyPath As String
Public Property PartsPath As String
Public Property Layer As Integer
Public Property Description As String
Public Property LocationID As Integer
Public Property LocationName As String
Public Property SupplierID As Integer
Public Property SupplierName As String
Public Property Active As Boolean
Public Property QA As Boolean
Public Property IsAssembly As Boolean
Public Property IsPurchasable As Boolean
Public Property IsMachined As Boolean
Public Property QtyRequired As Integer
Public Property TotalQty As Integer
Public Property Children As IDictionary(Of String, BOMComponentChild) = New Dictionary(Of String, BOMComponentChild)
End Class
私はこのようにそれを呼び出そうとしています:
Me.Database.SqlQuery(Of BOMComponentChild)("EXEC [BOMComponentChild] @ComponentID, @PathPrefix, @IsAssembly", params).ToList()
Management Studio でストアド プロシージャを実行すると、列は正しく、null ではありません。これらはストアドプロシージャの重要な情報であるため、これらがマップされない理由がわかりません。PartsPath と MyPath の型は varchar(50) です。
編集
そのため、これらの柱と他の柱の唯一の違いは、それらがキャストで作られていることであることに気付きました。最終選択でそれらを静的文字列に置き換えたところ、正しくマップされました。最後の選択を「テスト」に置き換えると、値がマップされます。CAST が SQL クエリで正しく表示されている場合、CAST の何が問題になっていますか。
;WITH BuildProducts ( ParentID, ComponentID, PartNumber
,PartsPath, MyPath, QtyRequired, TotalQty, Layer)
AS
(
SELECT ...
,@PathPrefix AS PartsPath
,CAST(@PathPrefix +
CAST(ComponentID AS varchar(4)) +
'/' AS varchar(50)
) AS MyPath
,...
FROM [dbo].[BOMComponent]
WHERE ...
UNION ALL
SELECT ...
,CAST(b.PartsPath +
CAST(a.ParentID AS varchar(4)) +
'/' AS varchar(50)
) AS PartsPath
,CAST(b.PartsPath +
CAST(a.ParentID AS varchar(4)) +
'/' +
CAST(a.ComponentID AS varchar(4)) +
'/' AS varchar(50)
) AS MyPath
,...
FROM [dbo].[BOMAssembly] a
INNER JOIN [dbo].[BOMComponent] c ON a.ComponentID = c.ComponentID
...
)
SELECT -- t.PartsPath
--,t.MyPath
'test' As PartsPath
,'test' As MyPath
,...
FROM BuildProducts t
...