2017-01-12 15 views
0

まず、これはレガシーアプリケーション用です。したがって、私は根本的に論理を変更することはできません。Linq Queryable - 関係のない2つのテーブルへの結合

私は、関係のない2つのテーブルを持つデータベースを持っています。私はこれを変更するかどうか尋ねましたが、私はできないと言われました。

あなたが見ることができるようにこれらのテーブルは

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 

として記述することができ、異なるフィールド名ですが、彼らはあまりにも異なる長さを持っていないだけ。

私はRepositoryと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

[this](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

関連する問題