sql_variantsに問題があります
2つのテーブルとDTOがあります
'struct A_Table1
' id (int)(not null)
' wert (sql_variant)(not null)
'struct A_Table2
' id (int)(not null)
' wert (sql_variant)(not null)
Private Class DTO
Public Property id As Integer
Public Property wert As Object
End Class
私はtbale1からすべてを選択するのが好きで、table2のテーブル1のIDに値が入力されている場合は、そこから値を取得するのが好きです。これは文字列(または文字列の前にある「wert」列の少なくとも1つ)でうまく機能します。ただし、両方の「wert」列がsql_variantsの場合、厄介な出力が得られます。
System.Collections.Generic.List`1[System.Object]
グリッド内のテキストとして、コンテンツを表示します。
ここにいくつかのサンプルコードがあります
Private Sub Button2_Click_1(sender As System.Object, e As System.EventArgs) Handles Button2.Click
Dim q = (From p In db.A_Table1s Select New DTO With {
.id = p.id,
.wert = If(db.A_Table2s.Any(Function(f) f.id = p.id And Not f.wert Is Nothing),
(From v In db.A_Table2s Where v.id = p.id Select v.wert).FirstOrDefault,
p.wert)
})
bs3.DataSource = q
grd.DataSource = bs3
End Sub
And the generated SQL
SELECT [t0].[id],
(CASE
WHEN EXISTS(
SELECT NULL AS [EMPTY]
FROM [dbo].[A_Table2] AS [t1]
WHERE [t1].[id] = [t0].[id]
) THEN 1
ELSE 0
END) AS [value], [t0].[wert]
FROM [dbo].[A_Table1] AS [t0]
その「AS[値]」は「奇妙」に見えます
このクエリがsql_variantsで機能しない理由を誰かに教えてもらえますか?
ありがとうございました
_レネ
ああ、私が今気付いたのは、Linqが2つの追加クエリを実行していることです(2番目のテーブルで穴が開いているすべてのエントリに対して:
SELECT TOP (1) [t0].[wert]
FROM [dbo].[A_Table2] AS [t0]
WHERE [t0].[id] = @x1
-- @x1: Input Int (Size = -1; Prec = 0; Scale = 0) [1]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
SELECT TOP (1) [t0].[wert]
FROM [dbo].[A_Table2] AS [t0]
WHERE [t0].[id] = @x1
-- @x1: Input Int (Size = -1; Prec = 0; Scale = 0) [3]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
そして、両方の値がオブジェクトのリストとして返されるDTOにマージされているようです
編集:わかりました、これは機能しましたが、ではありませんでした。
Dim q = (From p In db.A_Table1s
Group Join v In db.A_Table2s On p.id Equals v.id Into Group From v In Group.DefaultIfEmpty() Select New DTO With
{.id = p.id, .wert = If(v.wert Is Nothing, p.wert, v.wert)})
ただし、.Any「ソリューション」が機能しない理由を知ることは非常に素晴らしいことです。