我在使用LINQ进行dataTable的交叉连接查询时遇到了问题。
DataTable dt_edges = new DataTable();
dt_edges.Columns.Add("EdgeID", typeof(string));
dt_edges.Columns.Add("TriangleID", typeof(string));
dt_edges.Columns.Add("StartPointID", typeof(string));
dt_edges.Columns.Add("EndPointID", typeof(string));
dt_edges.Columns.Add("StartVerticeX", typeof(double));
dt_edges.Columns.Add("StartVerticeY", typeof(double));
dt_edges.Columns.Add("StartVerticeZ", typeof(double));
dt_edges.Columns.Add("EndVerticeX", typeof(double));
dt_edges.Columns.Add("EndVerticeY", typeof(double));
dt_edges.Columns.Add("EndVerticeZ", typeof(double));
var q = from a in dt_edges.AsEnumerable()
from b in dt_edges.AsEnumerable()
where (
a["StartVerticeX"].ToString() == b["StartVerticeX"].ToString()
&& a["StartVerticeY"].ToString() == b["StartVerticeY"].ToString()
&& a["EndVerticeX"].ToString() == b["EndVerticeX"].ToString()
&& a["EndVerticeY"].ToString() == b["EndVerticeY"].ToString()
)
select new {
edgeID = a["EdgeID"],
aSVX = a["StartVerticeX"],
aSVY = a["StartVerticeY"],
bSVZ = b["StartVerticeX"],
bSVY = b["StartVerticeY"]
};
foreach (var item in q)
{
textBox2.Text += item.edgeID.ToString() + ": " + item.aSVX.ToString() + " " + item.aSVY.ToString() + ", " + item.bSVZ.ToString() + " " + item.bSVY.ToString() + "\n";
}
当我运行代码时,我在dataTable中只有5条记录,但q的计数结果是225! 当我检查结果时,连续记录有多次重复,并且过滤器似乎没有真正正常工作。
我想要做的是仅过滤那些在dataTable中具有StartX和StartY以及EndX和EndY的那些。但是,我无法解决这个问题。
期待您的帮助。 欢呼声。
答案 0 :(得分:0)
具有共同数据的行? => group by
!
var q = from a in dt_edges.AsEnumerable()
group a by new { sx = a["StartVerticeX"],
sy = a["StartVerticeY"],
ex = a["EndVerticeX"],
ey = a["EndVerticeY"] } into g
where g.Count() > 1
from row in g select row;