2011-06-06 14 views
5

MySQL ve SQL Server tabloları katılın ve ben bu veritabanlarının ikisinden de bilgiye ihtiyacım var. Veritabanlarından biri bir MySql sunucusunda yaşıyor ve diğeri MS SQL Server'da yaşıyor. Neden tamamen farklı iki sunucu üzerinde yaşayan ilgili verilerimiz olduğunu sorma, uzun bir hikaye. üst düzey bir bakış açısıyla LINQ: İki tamamen ayrı veritabanları üzerinde yaşayan veriler ilgili olan

, ben SQLServerTableB için, bazı karmaşık kısıtlamalar yapmak ve muhtemelen bazı gruplandırma ölçütleri ve sayıları yapmak MySqlTableA katılması gerekir.

bu iki veritabanları arasında katılmadan oldukça kolay hale getirmek için bir yol bulmaya çalışıyorum. LINQ'un sorunlarımı çözebileceğini düşündüm, ancak bildiğim kadarıyla hem MySQL hem de SQL Server kaynaklarına sahip tek bir bağlam oluşturamıyorum. Bir MySql bağlamını oluşturmak için Devart en LinqConnect kullanarak - - Ben farklı bağlamlarda iki kaynağı koyabilirsiniz ama LINQ geçici içeriği katılır izin vermez.

Yani benim seçenekler nelerdir: (Simulating Cross Context Joins--LINQ/C# Ben yöntemi burada açıklanan çalıştı, ama işe yaramadı)? verimli (Aksi LINQ gerçi ya) bu iki farklı veritabanı sunucularında tabloları birleştirmek için bir yol var mı, yoksa döngü var ve elle veri katılmak için gidiyorum?

DÜZENLEME: belirtildiği gibi

, zaten AsQueryable() geçici çözümü denedim, ama yine de bir çapraz bağlam istisna olsun. İşte benim kodudur:

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(); 
} 

cevap

2

Ben SQL Server için MySQL ve Varlık Geliştirici için en son dotConnect kullanarak bir test uygulandı ve adres aşağıdaki örnekte olduğu gibi workaround uygulanmasında başarılı ?
Güncelleme. önceki "çapraz katılmak" çözüm aslında çok uygun değildir.

Bu çok iyi çalışmış olabilir
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) { 
     ... 
    } 
} 
+0

Denediğim kodu göstermek için soruma bir düzenleme ekledim, sizinkilere çok benziyor. Korkarım ki, size örnek bir proje gönderemem çünkü hassas bilgiler içerecektir. Ancak, yukarıda eklediğim kod örneği ne yaptığımı açıklığa kavuşturmalı. – ean5533

+0

@ ean5533, Cevabı güncelledim. – Devart

+0

Ah ha, işte başlıyoruz. Hafızada birleştirme yapmak için bir çeşit yolun olması gerektiğini biliyordum. .ToList() işlevinin bana hala bir LINQ tablosu gibi davranılabilen bir nesne verebileceğini anlayamadım. Bu bana ihtiyacım olanı veriyor, teşekkürler. – ean5533

4

Seçeneklerden biri MS SQL Server aracılığıyla MySQL veritabanı bağlamaktır. Sonra her iki veritabanına SQL Server DataContext'inizden erişin. İşte birkaç tane bağlantı kurmak için nasıl örnekler ve belgeler var: O tam With

, ya depolanmış ile bağlantılı tablolar ortaya çıkarmak isteyebilir Prosedürler veya görünümler, SQL Server veritabanının bir parçası gibi görünüyorlar.

bu yaklaşım (ve aklınıza gelebilecek herhangi bir yaklaşım) özellikle hızlı olmayacağını unutmayın. Veri tabanları ve bir ağ ile ilgili verilerin maliyetini hızlandırmak için sihir yoktur. En büyük faydası, uygulamanın geliştiriciye tutarlı ve basit bir şekilde sunulmasıdır. Sorunu gösteren

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(); 
} 

Eğer send us küçük bir test projesi söyleyebilir misiniz acaba:

+0

, ben hiç denemedim:
daha iyi bir çözüm her iki koleksiyonları gerçekleşmesi ve daha sonra bellek içi bir materialized nesnelerin katılmak yapmaktır.Benim DBA'm db sunucularını çok koruyor ve bana (düşük programcı) benim pis ellerini sunucusuna koymasına izin vermeden önce ölümle savaşırdı. Yine de öneri için teşekkür ederim. – ean5533

İlgili konular