根据大型项目列表从大表中获取数据



我有一个75000记录的ID列表。基于此,我需要从C#中具有1700000 记录的另一个表中获取相应的项目。我尝试了foreach,这需要1个以上的时间。桌子都在不同的服务器中。我尝试在Linq中包含,但它不起作用。请给我一些更好的选择。

 foreach(var item in cotext1.Table1)
 {
   var Employee=Context2.table2.where(x=>x.EmpId==item.Id);
 }

我试图加入,但摆脱记忆例外。

澄清评论中讨论的内容:

  1. 创建与ID列表相对应的用户定义的类型(因为ID在您的列表中重复是没有意义的 - 我使其成为主要密钥(:

    CREATE TYPE dbo.IntHashSet AS TABLE 
    (
        ID int NOT NULL PRIMARY KEY 
    )
    
  2. 查询:

    using (var ctx = new TestDBEntities()) {
        // fill data table with your ids
        var dt = new DataTable();
        dt.Columns.Add("ID", typeof(int));                    
        for (int i = 0; i < 75000; i++) {
           dt.Rows.Add(i);
        }
        // make a query
        var result = ctx.Database.SqlQuery<BigTable>("select BT.* from BigTable BT inner join @IDS I on BT.CodeID = I.ID",
            new SqlParameter("IDS", SqlDbType.Structured)
            {                        
                // name of type you created in step 1
                TypeName = "dbo.IntHashSet",
                Value = dt
            }).ToArray();
    }
    

此查询具有75.000 ID的对抗表,其1.700.000行在我的(非服务器,消费者等级(机器上大约需要600ms。比现在您的查询(超过一个小时(要快的几个尺寸的尺寸。

您可以在linq中使用JOIN语句

    Server1Entities dc1 = new Server1Entities ();
    List<IDTable> ids = (from ro in dc1.IDTable select ro).ToList();
    Server2Entities dc2 = new Server2Entities();
    var list = (from firstTable in ids
                join secondTable in dc.YourSecondTable
                on firstTable.ID equals secondTable.ID
                select new {
                 field1 = firstTable.Field1,
                 field2 = secondTableField1 // You can define fieldnames as you want.
                }).ToList();

另一个选项是使用Morelinq库。真的很棒。您可以看看:

https://github.com/morelinq/morelinq

最新更新