2017-01-12 7 views
0

Erstens ist dies für eine Legacy-Anwendung, so dass ich keine Logik radikal ändern kann.Linq Queryable - Verbinden von zwei Tabellen ohne Beziehungen

Ich habe Datenbank mit zwei Tabellen, die keine Beziehungen haben. Ich fragte, ob ich das ändere, aber mir wurde gesagt, dass ich das nicht kann.

Diese Tabellen können als

Create Table T1 
    [doc_id] [int] NOT NULL,     -- Primary Key 
    [customer_acc_no] [varchar](16) NULL, 
    [gcompany] [varchar](30) NULL, 
    .... 
    extra fields 

und Tisch sind

Create Table T2 
    [UserURN] [int] NOT NULL,     -- All three fields make up 
    [AccountNumber] [varchar](20) NOT NULL, -- the primary key 
    [Company] [varchar](50) NOT NULL, 
    .... 
    extra fields 

Wie Sie sehen können, nicht nur die Feldnamen unterschiedlich beschrieben werden, aber sie haben auch unterschiedliche Längen aufweisen.

Ich verwende die Repository und UnitOfWork Muster. Bis jetzt habe ich es geschafft, folgendes zu codieren:

private IRepository<T1> _t1Repository; 
private IRepository<T2> _t2Repository; 

Diese werden innerhalb des Konstruktors aufgefüllt.

Als nächstes verwende ich den folgenden Code, um ein abfragbares Repository zu konfigurieren.

var retVal = _t1Repository.Queryable(); 

Von diesem versuche ich, den folgenden Join hinzuzufügen.

from q in T1 
join w in T2 
on new { X1 = q.gcompany, X2 = q.Customer_acc_no } 
equals new { X1 = w.Company, X2 = w.AccountNumber } 

Ich denke es entlang der Linien würde:

var query = T1.GroupJoin(T2, 
     c => c.gcompany, 
     o => o.Company, 
     (c, result) => new Result(c.doc_id, result)) 
    .GroupJoin(T2, 
     c => c.Customer_acc_no, 
     o => o.AccountNumber , 
     (c, result) => new Result(c.doc_id, result)); 

, aber ich bin nicht sicher, wie alle Versuche bisher Fehler in Visual Studio zu beenden.

+1

nur eine Idee, um die Tonhöhe, wenn alle drei Felder 1 Schlüssel bilden, können Sie eine neue Klasse enthält die Felder erstellen und einen benutzerdefinierten comparer für die Klasse. – RandomStranger

+0

Können Sie bitte erklären, wie ich zu allen Dingen neu bin Linq – gilesrpa

+0

Ich werde auf [this] (http://stackoverflow.com/questions/634826/using-an-object-as-a-generic-dictionary-key) verweisen) Frage Antwort. Es geht darum, eine Klasse als Schlüssel für ein Wörterbuch zu verwenden, aber ich bin mir ziemlich sicher, dass es für Ihren Fall anwendbar ist. – RandomStranger

Antwort

1

Siehe Code unten:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication42 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      DataTable dt1 = new DataTable(); 
      dt1.Columns.Add("doc_id", typeof(int)); 
      dt1.Columns.Add("customer_acc_no", typeof(string)); 
      dt1.Columns.Add("gcompany", typeof(string)); 

      dt1.Rows.Add(new object[] { 1, "100", "abc" }); 
      dt1.Rows.Add(new object[] { 2, "100", "def" }); 
      dt1.Rows.Add(new object[] { 3, "100", "def" }); 
      dt1.Rows.Add(new object[] { 4, "101", "abc" }); 
      dt1.Rows.Add(new object[] { 5, "101", "ghi" }); 
      dt1.Rows.Add(new object[] { 6, "102", "jkl" }); 
      dt1.Rows.Add(new object[] { 7, "102", "abc" }); 
      dt1.Rows.Add(new object[] { 8, "102", "def" }); 
      dt1.Rows.Add(new object[] { 9, "103", "abc" }); 
      dt1.Rows.Add(new object[] { 10, "103", "abc" }); 


      DataTable dt2 = new DataTable(); 
      dt2.Columns.Add("UserURN", typeof(int)); 
      dt2.Columns.Add("AccountNumber", typeof(string)); 
      dt2.Columns.Add("Company", typeof(string)); 

      dt2.Rows.Add(new object[] { 11, "100", "abc" }); 
      dt2.Rows.Add(new object[] { 12, "100", "def" }); 
      dt2.Rows.Add(new object[] { 13, "100", "def" }); 
      dt2.Rows.Add(new object[] { 14, "101", "abc" }); 
      dt2.Rows.Add(new object[] { 15, "101", "ghi" }); 
      dt2.Rows.Add(new object[] { 16, "102", "jkl" }); 
      dt2.Rows.Add(new object[] { 17, "102", "abc" }); 
      dt2.Rows.Add(new object[] { 18, "102", "def" }); 
      dt2.Rows.Add(new object[] { 19, "103", "abc" }); 
      dt2.Rows.Add(new object[] { 20, "103", "abc" }); 

      var results = from r1 in dt1.AsEnumerable() 
          join r2 in dt2.AsEnumerable() on 
          new { x1 = r1.Field<string>("customer_acc_no"), x2 = r1.Field<string>("gcompany") } equals 
          new { x1 = r2.Field<string>("AccountNumber"), x2 = r2.Field<string>("Company") } 
          select new { t1 = r1, t2 = r2 }; 
     } 
    } 
} 
+0

Es funktioniert, aber es verwendet nicht das Repository-Muster – gilesrpa

Verwandte Themen