Asp.net Linq Any()超时
我试图使用Linq比较两个数据表。非常简单的表,只有一列,但有大约44000行。我使用了以下命令,但当我跟踪它时,当它到达if(dr.Any())时,它就在那里,下一行或异常永远不会执行:Asp.net Linq Any()超时,asp.net,linq,.net-4.5,Asp.net,Linq,.net 4.5,我试图使用Linq比较两个数据表。非常简单的表,只有一列,但有大约44000行。我使用了以下命令,但当我跟踪它时,当它到达if(dr.Any())时,它就在那里,下一行或异常永远不会执行: public static DataTable GetTableDiff(DataTable dt1, DataTable dt2) { DataTable dtDiff = new DataTable(); try { var dr = from r in dt1.A
public static DataTable GetTableDiff(DataTable dt1, DataTable dt2)
{
DataTable dtDiff = new DataTable();
try
{
var dr = from r in dt1.AsEnumerable() where !dt2.AsEnumerable().Any(r2 => r["FacilityID"].ToString().Trim().ToLower() == r2["FacilityID"].ToString().Trim().ToLower()) select r;
if (dr.Any())
dtDiff = dr.CopyToDataTable();
}
catch (Exception ex)
{
}
return dtDiff;
}
我在web.config中设置了最大请求长度,以确保这不是问题,但没有更改:
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5" maxRequestLength="1048576" />
我不认为44000行太大,是吗 连接表O(N1+N2),而不是执行O(N1*N2)搜索(当前针对dt1中的每一行,您正在扫描dt2中的所有行):
它也可以用于搜索交叉点我会使用一种不同的、更轻量级的方法,因为您只需要从一个表中获取行,并且只需要那些具有新的
工具ID的行
:
public static DataTable GetTableDiff(DataTable dtNew, DataTable dtOld)
{
DataTable dtDiff = dtNew.Clone(); // no data only columns and constraints
var oldFacilityIds = dtOld.AsEnumerable().Select(r => r.Field<string>("FacilityID").Trim());
var oldFacilityIDSet = new HashSet<string>(oldFacilityIds, StringComparer.CurrentCultureIgnoreCase);
var newRows = dtNew.AsEnumerable()
.Where(r => !oldFacilityIDSet.Contains(r.Field<string>("FacilityID").Trim()));
foreach (DataRow row in newRows)
dtDiff.ImportRow(row);
return dtDiff;
}
公共静态数据表GetTableDiff(数据表dtNew,数据表dtOld)
{
DataTable dtDiff=dtNew.Clone();//无数据列和约束
var oldFacilityId=dtOld.AsEnumerable().Select(r=>r.Field(“FacilityID”).Trim());
var oldFacilityIDSet=新哈希集(oldFacilityId,StringComparer.CurrentCultureInogoreCase);
var newRows=dtNew.AsEnumerable()
其中(r=>!oldFacilityIDSet.Contains(r.Field(“FacilityID”).Trim());
foreach(新行中的数据行)
dtDiff.ImportRow(世界其他地区);
返回dtDiff;
}
指定输入流缓冲阈值的限制,以KB为单位。此限制可用于防止由用户向服务器发送大文件等引起的拒绝服务攻击。
它与请求大小有关,而与Linq查询无关。感谢您的回复。你的解决方案和蒂姆的解决方案都同样有效,但我把你的作为一个答案,因为它是第一个。
public class FacilityIdComparer : IEqualityComparer<DataRow>
{
public bool Equals(DataRow x, DataRow y) => GetFacilityID(x) == GetFacilityID(y);
public int GetHashCode(DataRow row) => GetFacilityID(row)?.GetHashCode() ?? 0;
private string GetFacilityID(DataRow row)
=> row.Field<string>("FacilityID")?.Trim().ToLower();
}
var diff = dt2.AsEnumerable().Except(dt1.AsEnumerable(), new FacilityIdComparer());
public static DataTable GetTableDiff(DataTable dtNew, DataTable dtOld)
{
DataTable dtDiff = dtNew.Clone(); // no data only columns and constraints
var oldFacilityIds = dtOld.AsEnumerable().Select(r => r.Field<string>("FacilityID").Trim());
var oldFacilityIDSet = new HashSet<string>(oldFacilityIds, StringComparer.CurrentCultureIgnoreCase);
var newRows = dtNew.AsEnumerable()
.Where(r => !oldFacilityIDSet.Contains(r.Field<string>("FacilityID").Trim()));
foreach (DataRow row in newRows)
dtDiff.ImportRow(row);
return dtDiff;
}