我有一个75000条记录的ID列表。基于此,我需要从另一个在c#中有1700000条记录的表中获取相应的项目。我尝试使用foreach并且需要1个多小时。两个表都在不同的服务器中。我尝试在linq中包含它并且它不起作用。请给我一些更好的选择。
foreach(var item in cotext1.Table1)
{
var Employee=Context2.table2.where(x=>x.EmpId==item.Id);
}
我尝试加入,但内存异常。
答案 0 :(得分:2)
澄清评论中讨论的内容:
创建与您的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();
}
对于我的(非服务器级,消费级)计算机,此查询对具有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库。非常特别。 你可以看看: