投稿者 shu  (社会人) 投稿日時 2017/9/13 12:54:09
Dim q~まではサンプルデータを作っているだけなので
それ以降が該当処理になってきます。
希望の処理を実現する箇所は

Where Function()
End Function()

のところになってきます。
ここに条件処理を記述すれば動的な判定が出来ます。
長くなってしまうようであれば

Where Function() Check(a,b)

としてCheckを外部に定義する方法もあります。ただしこの場合a,bの
型がCheckで認識できないといけないので作成済のクラスのインスタンスとして
渡す必要があります。


        Dim tbl1 As New DataTable()
        Dim tbl2 As New DataTable()

        With tbl1.Columns
            .Add("ID"GetType(Integer))
            .Add("Name"GetType(String))
            .Add("CID"GetType(Integer))
        End With

        With tbl2.Columns
            .Add("ID"GetType(Integer))
            .Add("Name"GetType(String))
        End With

        tbl1.Rows.Add(1, "Name1", 1)
        tbl1.Rows.Add(2, "Name2", 2)
        tbl1.Rows.Add(3, "Name3", 1)
        tbl1.Rows.Add(4, "Name4", 2)
        tbl1.AcceptChanges()
        tbl2.Rows.Add(1, "CName1")
        tbl2.Rows.Add(2, "CName2")
        tbl2.AcceptChanges()

        Dim q1 = (From r1 In tbl1.AsEnumerable
                  Select id = CInt(r1("ID")), Name = CStr(r1("name")), CID = CInt(r1("cid")))

        Dim q2 = (From r2 In tbl2.AsEnumerable
                  Select id = CInt(r2("ID")), CName = CStr(r2("name")))

        Dim q = (From a In q1
                 Join b In q2 On a.CID Equals b.id
                 Where Function()
                           Dim ret = a.id < 3
                           ret = ret AndAlso b.id = 1
                           Return ret
                       End Function())

        For Each itm In q
            Console.WriteLine($"{itm.a.id} {itm.a.Name} {itm.b.CName}")
        Next