LINQ: объединение таблиц MySql и SQL Server - PullRequest
5 голосов
/ 06 июня 2011

У меня есть связанные данные, живущие в двух совершенно разных базах данных, и мне нужна информация из обеих этих баз данных.Одна из баз данных находится на сервере MySql, а другая - на MS SQL Server.Не спрашивайте, почему у нас есть связанные данные, живущие на двух совершенно разных серверах, это длинная история.

С точки зрения высокого уровня, мне нужно присоединиться MySqlTableA к SQLServerTableB, выполнить некоторые сложные ограничения и, возможно, выполнить некоторые операции BY BY и подсчета.

Я пытаюсь найти способ сделать соединение этих двух баз данных достаточно простым.Я думал, что LINQ может решить мои проблемы, но, насколько я знаю, я не могу создать один контекст, в котором есть как источники MySql, так и источники SQL Server.Я могу поместить два источника в разные контексты - используя LinqConnect Devart для создания контекста MySql, - но LINQ не допускает соединения между контекстами.(Я попробовал метод, описанный здесь, но он не работал: Имитация перекрестных контекстных соединений - LINQ / C # )

Итак, какие у меня варианты?Есть ли способ эффективно объединить таблицы на этих двух разных серверах баз данных (хотя LINQ или иным образом), или мне придется циклически проходить и объединять данные вручную?

РЕДАКТИРОВАТЬ:

Как уже упоминалось, я уже пробовал обходной путь AsQueryable (), но я все еще получаю межконтекстное исключение.Вот мой код:

public static MySqlDataContext mysql = new MySqlDataContext();
public static SQLDataContext sql = new SQLDataContext();

public static void Main() {
    var rows = from a in mysql.tableA
               join b in GetTableBs() on a.col equals b.col
               select a;

    //exception gets thrown when rows is enumerated.
    //InvalidOperationException: "The query contains references to items defined on a different data context."
    foreach(var row in rows) {
        ...
    }
}

public static IEnumerable<TableB> {
    return sql.TableBs.AsQueryable();
}

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Один из вариантов - связать вашу базу данных MySql через MS SQL Server.Затем получите доступ к обеим базам данных через ваш SQL Server DataContext.Вот несколько примеров того, как настроить ссылку и документы:

После этого вы можете захотеть выставить связанныйтаблицы с хранимыми процедурами или представлениями, так что они кажутся частью базы данных SQL Server.

Имейте в виду, что этот подход (и любой подход, который я могу придумать) не будет особенно быстрым.Там нет волшебства, чтобы ускорить расходы на связь данных между базами данных и сети.Самым большим преимуществом является то, что он предоставляет согласованное и простое представление данных разработчику приложения.

2 голосов
/ 07 июня 2011

Я выполнил тест, используя последнюю версию dotConnect для MySQL и Entity Developer для SQL Server, и преуспел в реализации обходного пути , как в следующем примере:

  var join = from d in GetDepts()
             from e in db1.Emps
             select new {
               e.ENAME,
               d.DNAME
             };
  join.ToList();
}
public IEnumerable<DEPT> GetDepts() {
  return db.DEPTs.AsQueryable();
}

Не могли бы вы отправить нам небольшой тестовый проект, иллюстрирующий проблему?
Обновление. Предыдущее решение "перекрестного соединения" на самом деле не очень подходит.
Лучшее решение состоит в том, чтобы материализовать обе коллекции и затем выполнить объединение материализованных объектов в памяти:

public static MySqlDataContext mysql = new MySqlDataContext();
public static SQLDataContext sql = new SQLDataContext();

public static void Main() {
  var qA = mysql.tableA.ToList();
  var qB = sql.TableBs.ToList();
  var rows = from a in qA
             join b in qB on a.col equals b.col
             select a;

  foreach(var row in rows) {
      ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...