跨WCF数据服务的动态连接

跨WCF数据服务的动态连接,wcf,wcf-data-services,dynamic-linq,Wcf,Wcf Data Services,Dynamic Linq,我正在通过WCF数据服务原型化一个通用数据浏览器 用户可以从树视图中选择实体,因此我不能硬编码查询结果类型,而必须动态编码查询(URI或LINQ) 为了提供跨不同数据服务的联接,我正在将每个数据服务的结果加载到客户端,并尝试动态联接它们: Dim q1 As IQueryable = ctx.Execute(Of Object)(New Uri("Service1.svc/Customers")).ToList.AsQueryable Dim q2 As IQueryable = ctx.Ex

我正在通过WCF数据服务原型化一个通用数据浏览器

用户可以从树视图中选择实体,因此我不能硬编码查询结果类型,而必须动态编码查询(URI或LINQ)

为了提供跨不同数据服务的联接,我正在将每个数据服务的结果加载到客户端,并尝试动态联接它们:

Dim q1 As IQueryable = ctx.Execute(Of Object)(New Uri("Service1.svc/Customers")).ToList.AsQueryable

Dim q2 As IQueryable = ctx.Execute(Of Object)(New Uri("Service2.svc/Orders")).ToList.AsQueryable

Dim j = q1.JoinDynamic("q1", q2, "q2", "q1.CustomerID", "q2.CustomerID", "New (q1.CustomerID as q1id, q1.CompanyName as CompanyName)")
我在使用dynamich连接时遇到问题。见:

  • 当类型直到运行时才知道时,ctx.Execute是查询结果的正确方法吗

  • 有人对如何通过数据服务实现动态连接有更好的想法吗


  • 作为一种解决方法,我通过内存中的程序集动态创建了连接代码。 这似乎很有效。 我可以在调试器中看到连接结果。 我只是不知道如何将结果绑定到DataGrid

            Dim codeDomProvider = New VBCodeProvider
        Dim cp As New Compiler.CompilerParameters
        cp.GenerateExecutable = False
        cp.GenerateInMemory = True
        cp.CompilerOptions = "/optionexplicit- /optionstrict-"
        cp.ReferencedAssemblies.Add(IO.Path.ChangeExtension(My.Application.Info.AssemblyName, "exe"))
        cp.ReferencedAssemblies.Add("System.dll")
        cp.ReferencedAssemblies.Add("System.Core.dll")
        cp.ReferencedAssemblies.Add("System.Data.Services.Client.dll")
    
        Dim sb = New Text.StringBuilder()
        sb.Append("Imports System" & vbCrLf)
        sb.Append("Imports System.Linq" & vbCrLf)
        sb.Append("Imports " & My.Application.Info.AssemblyName & vbCrLf)
        sb.Append("Public Class JoinHelper" & vbCrLf)
        sb.Append("Public Shared Function GetData() As Object" & vbCrLf)
        sb.Append("  Dim ctx1 As New NorthwindDataService.NorthwindEntities(New Uri(""http://localhost:3631/NorthwindDataService.svc/""))" & vbCrLf)
        sb.Append("  Dim ctx2 As New SalesDataService.SalesEntities(New Uri(""http://localhost:4354/SalesDataService.svc""))" & vbCrLf)
        sb.Append("  Dim q1 as System.Data.Services.Client.QueryOperationResponse (of NorthwindDataService.Customers) = ctx1.Execute(Of NorthwindDataService.Customers)(New Uri(""Customers"", UriKind.Relative))" & vbCrLf)
        sb.Append("  Dim q2 as System.Data.Services.Client.QueryOperationResponse (of SalesDataService.CustomerSize) = ctx2.Execute(Of SalesDataService.CustomerSize)(New Uri(""CustomerSize"", UriKind.Relative))" & vbCrLf)
        sb.Append("  Dim j = From c In q1 Join s In q2 On c.CustomerID Equals s.CustomerID Select New With {c.CompanyName, s.Size}" & vbCrLf)
        'sb.Append("  return j.tostring" & vbCrLf)
        sb.Append("  return j" & vbCrLf)
        'sb.Append("  r = j.ToList" & vbCrLf)
        'sb.Append("  return r" & vbCrLf)
        sb.Append("End Function" & vbCrLf)
        sb.Append("End Class" & vbCrLf)
        sb.Append(vbCrLf)
        Dim code = sb.ToString
        Dim compilerResults = codeDomProvider.CompileAssemblyFromSource(cp, code)
        If compilerResults.Errors.HasErrors Then
            Throw New ApplicationException(compilerResults.Errors.Item(0).ToString)
        End If
        Dim o = compilerResults.CompiledAssembly.CreateInstance("JoinHelper")
        Dim t = o.GetType
        Dim j = t.InvokeMember("GetData", Reflection.BindingFlags.InvokeMethod, Nothing, o, Nothing)
        DataGrid1.ItemsSource = j