我有一个75000记录的ID列表。基于此,我需要从C#中具有1700000 记录的另一个表中获取相应的项目。我尝试了foreach,这需要1个以上的时间。桌子都在不同的服务器中。我尝试在Linq中包含,但它不起作用。请给我一些更好的选择。
foreach(var item in cotext1.Table1)
{
var Employee=Context2.table2.where(x=>x.EmpId==item.Id);
}
我试图加入,但摆脱记忆例外。
澄清评论中讨论的内容:
-
创建与ID列表相对应的用户定义的类型(因为ID在您的列表中重复是没有意义的 - 我使其成为主要密钥(:
CREATE TYPE dbo.IntHashSet AS TABLE ( ID int NOT NULL PRIMARY KEY )
-
查询:
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