none
Как создать LINQ запрос в котором участвуют SQL таблица и временная таблица, размещенная в dataset RRS feed

  • Вопрос

  • Добрый вечер!
    Подскажите, пожалуйста, как можно выполнить запрос к двум различным таблицам: SQL таблица, к которой я подключаюсь с помощью класса LINQ to SQL, и второй к которой я подключаюсь как к объекту dataset. 
    По отдельности, к каждой таблице  запрос работает. Но как только я пытаюсь сделать запрос к двум таблицам -  выдается ошибка на стадии выполнения: "Локальная последовательность может быть использована в LINQ to SQL - реализации операторов запроса за исключением оператора Contains()." Вот пример, который не работает :-(.

    Imports System.Linq
    Imports System.Data.Linq

    Public Class Form1
        Dim ds As New DataSet
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            
           'Эта часть кода позволяет подключиться к SQL таблице.
            Dim dc As New DataClasses1DataContext
            Dim Query1 = From c In dc.table1
            For Each item In Query1
                Console.WriteLine(item.kod)
            Next
           
    'эта часть кода подключается к временной таблице и запрос только к ней тоже прекрасно выполняется
            CreateDataset()
            Dim tb = ds.Tables("t1").AsEnumerable
            Dim Query2 = From d In tb
            For Each item In Query2
                Console.WriteLine(item("col"))
            Next
    'в этой части кода я пытаюсь выполнить запрос к двум таблицам. Что я делаю не правильно?
            Dim Query3 = From f In dc.table1 Join h In tb On f.kod Equals h("col") Select f.kod, f.id
            For Each item In Query3
                Console.WriteLine(item.kod)
            Next
        End Sub
    ' это подпрограмма создающая временную таблицу и заполняющая ее тремя строчками    
            Sub CreateDataset()
            Dim tb As DataTable = New DataTable("t1")
            tb.Columns.Add("col", Type.GetType("System.Int64"))
            ds.Tables.Add(tb)
            Dim r As DataRow
            r = tb.NewRow()
            r("col") = 1
            tb.Rows.Add(r)
            r = tb.NewRow()
            r("col") = 2
            tb.Rows.Add(r)
            r = tb.NewRow()
            r("col") = 3
            tb.Rows.Add(r)
        End Sub
    End Class

    • Перемещено I.Vorontsov 25 февраля 2010 г. 10:26 (От:Разработка Windows-приложений)
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 0:22 MSDN Forums consolidation (От:SQL Server для разработчиков)
    23 февраля 2010 г. 14:36

Ответы

  • Спасибо за понимание, Денис!
    Вы правы, именно так все и происходит.
    Долго я ждал ответа и нашел решение сам:
    Dim Query = From f In dc.table1.AsEnumerable Join h In ds.Tables("t1").AsEnumerable On f.kod Equals h("col") Select f.kod, f.id
    Этот код прекрасно работает.
    Всем спасибо, кто пытался мне помочь.

    • Помечено в качестве ответа 7965975 26 февраля 2010 г. 4:57
    26 февраля 2010 г. 4:57

Все ответы

  •  На VB не пишу, но думаю понял, что вы хотите сделать. Смотрите:

    Dim Query3 = From f In dc.table1 Join h In tb On f.kod Equals h("col") Select f.kod, f.id

    По сути это метаинформация, по которой компилятор строит либо дерево выражений (объякты находятся в БД), либо foreach (объекты находятся в памяти). Левая часть вашего выражения - база, правая - память. Для такой ситуации дерево выражений не может быть построено. Вам нужно либо джойнить таблицы которые лежат в БД (избавиться от DataTable), либо вытягивать в память dc.table1 и работать с двумя коллекциями в памяти.
    25 февраля 2010 г. 11:48
  • Спасибо за понимание, Денис!
    Вы правы, именно так все и происходит.
    Долго я ждал ответа и нашел решение сам:
    Dim Query = From f In dc.table1.AsEnumerable Join h In ds.Tables("t1").AsEnumerable On f.kod Equals h("col") Select f.kod, f.id
    Этот код прекрасно работает.
    Всем спасибо, кто пытался мне помочь.

    • Помечено в качестве ответа 7965975 26 февраля 2010 г. 4:57
    26 февраля 2010 г. 4:57