1

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「ソリューション」が機能しない理由を知ることは非常に素晴らしいことです。

4

0 に答える 0