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

时间:2018-02-12 08:20:43

标签: c# sql asp.net entity-framework linq

我有一个75000条记录的ID列表。基于此,我需要从另一个在c#中有1700000条记录的表中获取相应的项目。我尝试使用foreach并且需要1个多小时。两个表都在不同的服务器中。我尝试在linq中包含它并且它不起作用。请给我一些更好的选择。

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

我尝试加入,但内存异常。

2 个答案:

答案 0 :(得分:2)

澄清评论中讨论的内容:

  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();
    }
    
  3. 对于我的(非服务器级,消费级)计算机,此查询对具有1.700.000行的表的75.000 ids大约需要600毫秒。对于你的查询(超过一小时),这几个目标的速度要快几倍。

答案 1 :(得分:0)

您可以在linq中使用连接语句

    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