C# Linq可查询-连接两个没有关系的表

C# Linq可查询-连接两个没有关系的表,c#,linq,repository-pattern,unit-of-work,ef-fluent-api,C#,Linq,Repository Pattern,Unit Of Work,Ef Fluent Api,首先,这是针对遗留应用程序的,因此我无法从根本上更改任何逻辑 我的数据库中有两个没有任何关系的表。我问我是否可以改变这个,但被告知我不能 这些表格可以描述为 Create Table T1 [doc_id] [int] NOT NULL, -- Primary Key [customer_acc_no] [varchar](16) NULL, [gcompany] [varchar](30) NULL, .... ext

首先,这是针对遗留应用程序的,因此我无法从根本上更改任何逻辑

我的数据库中有两个没有任何关系的表。我问我是否可以改变这个,但被告知我不能

这些表格可以描述为

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;
在此基础上,我尝试添加以下连接

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中的所有尝试都以错误告终。

请参阅下面的代码:

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 };
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序42
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt1=新DataTable();
dt1.Columns.Add(“doc_id”,typeof(int));
dt1.Columns.Add(“客户号”,类型(字符串));
dt1.Columns.Add(“gcompany”,typeof(string));
Add(新对象[]{1,“100”,“abc”});
Add(新对象[]{2,“100”,“def”});
Add(新对象[]{3,“100”,“def”});
Add(新对象[]{4,“101”,“abc”});
添加(新对象[]{5,“101”,“ghi”});
Add(新对象[]{6,“102”,“jkl”});
Add(新对象[]{7,“102”,“abc”});
Add(新对象[]{8,“102”,“def”});
Add(新对象[]{9,“103”,“abc”});
Add(新对象[]{10,“103”,“abc”});
DataTable dt2=新的DataTable();
添加(“UserURN”,typeof(int));
dt2.Columns.Add(“AccountNumber”,typeof(string));
dt2.Columns.Add(“公司”,类型(字符串));
Add(新对象[]{11,“100”,“abc”});
Add(新对象[]{12,“100”,“def”});
Add(新对象[]{13,“100”,“def”});
Add(新对象[]{14,“101”,“abc”});
添加(新对象[]{15,“101”,“ghi”});
Add(新对象[]{16,“102”,“jkl”});
Add(新对象[]{17,“102”,“abc”});
Add(新对象[]{18,“102”,“def”});
Add(新对象[]{19,“103”,“abc”});
Add(新对象[]{20,“103”,“abc”});
var结果=来自dt1中的r1.AsEnumerable()
在上的dt2.AsEnumerable()中加入r2
新的{x1=r1.字段(“客户帐户号”),x2=r1.字段(“gcompany”)}等于
新的{x1=r2.Field(“AccountNumber”),x2=r2.Field(“Company”)}
选择新的{t1=r1,t2=r2};
}
}
}

为了提出一个想法,如果所有3个字段组成一个键,您可以创建一个包含这些字段的新类,并为该类创建一个自定义比较器。请您解释一下,因为我对所有事情都不熟悉,林琦将参考问题/答案。它谈到使用类作为字典的键,但我非常确定它适用于您的情况。在查看提供的链接后,我可能没有抓住要点,但我使用的是存储库模式,而不是字典查找,因此我不确定您的建议。对不起,有什么问题吗?您从T1中的q开始使用LINQ查询语法
,在T2中使用join w…
,为什么不继续该查询,而不是尝试
GroupJoin
和类似的方法语法查询。它可以工作,但不使用存储库模式
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 };
        }
    }
}