2017-01-12 2 views
0

Premièrement, ceci est pour une application héritée, donc je ne peux pas changer radicalement la logique.Linq Queryable - Rejoindre deux tables sans relation

J'ai une base de données avec deux tables qui n'ont aucune relation. J'ai demandé si je change cela, mais on m'a dit que je ne peux pas.

Ces tableaux peuvent être décrits comme

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

et une table

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 

Comme vous pouvez le voir, non seulement sont les noms des champs différents, mais ils ont des longueurs différentes aussi. J'utilise les modèles Repository et UnitOfWork. Jusqu'à présent, j'ai réussi à coder ce qui suit:

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

Ceux-ci sont remplis dans le constructeur.

Ensuite, j'utilise le code suivant pour configurer obtenir un référentiel interrogeable.

var retVal = _t1Repository.Queryable(); 

De cela, j'essaye d'ajouter la jointure suivante.

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 } 

Je pense que ce serait le long des lignes de:

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

mais je ne suis pas sûr que toutes les tentatives aboutissent à ce jour des erreurs dans Visual Studio.

+1

Juste au pas une idée, si les 3 champs constituent une clé, vous pouvez créer une nouvelle classe contenant ces champs et créer un comparateur personnalisé pour ladite classe. – RandomStranger

+0

Pouvez-vous s'il vous plaît expliquer comme je suis nouveau à toutes les choses Linq – gilesrpa

+0

Je ferai référence à [this] (http://stackoverflow.com/questions/634826/using-an-object-as-a-generic-dictionary-key) Question Réponse. Il parle d'utiliser une classe comme une clé pour un dictionnaire, mais je suis à peu près sûr que cela s'applique à votre cas. – RandomStranger

Répondre

1

Code Voir ci-dessous:

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

Cela fonctionne, mais il n'utilise pas le modèle de référentiel – gilesrpa