Динамическое соединение через службы данных WCF - PullRequest
1 голос
/ 06 февраля 2010

Я создаю прототип универсального браузера данных через службы данных WCF.

Пользователь может выбирать объекты из TreeView, поэтому я не могу жестко закодировать типы результатов запроса и должен динамически кодировать запросы (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)")

У меня возникла проблема с использованием динамического соединения. См .: текст ссылки

  1. Является ли ctx.Execute правильным способом для запроса результатов, когда типы не известны до времени выполнения?

  2. Кто-нибудь лучше знает, как реализовать динамические объединения через службы данных?

1 Ответ

0 голосов
/ 12 февраля 2010

В качестве обходного пути я динамически создал код соединения через сборку в памяти. Кажется, это работает нормально. Я вижу результат соединения в отладчике. Я только не знаю, как связать результат с 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
...