2017-01-12 12 views
0

Во-первых, это для устаревшего приложения, поэтому я не могу радикально изменить какую-либо логику.Linq Queryable - объединение двух таблиц без связей

У меня есть база данных с двумя таблицами, у которых нет никаких отношений. Я спросил, могу ли я изменить это, но мне сказали, что не могу.

Эти таблицы могут быть описаны как

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

и стол

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 

Как вы можете видеть, не только имена полей различны, но они имеют разные длины тоже.

Я использую шаблоны репозитория и UnitOfWork. До сих пор мне удалось скопировать следующее:

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

Они заполнены внутри конструктора.

Далее я использую следующий код, чтобы настроить получение запрашиваемого репозитория.

var retVal = _t1Repository.Queryable(); 

Из этого, я пытаюсь добавить следующее соединение.

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 } 

Я имею в виду, это было бы по линии:

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

, но я не уверен, как все попытки до сих пор заканчиваются ошибки в Visual Studio.

+1

Просто, чтобы передать идею, если все 3 поля составляют 1 ключ, вы можете создать новый класс, содержащий эти поля и создать собственный компаратор для указанного класса. – RandomStranger

+0

Не могли бы вы объяснить, что я новичок во всех вещах Linq – gilesrpa

+0

Я буду ссылаться на [это] (http://stackoverflow.com/questions/634826/using-an-object-as-a-generic-dictionary-key) вопрос ответ. В нем говорится об использовании класса в качестве ключа для словаря, но я уверен, что он применим для вашего дела. – RandomStranger

ответ

1

См код ниже:

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

Он работает, но не использует шаблон репозитория – gilesrpa

 Смежные вопросы

  • Нет связанных вопросов^_^