2013-04-30 53 views
1

我使用LINQ進行數據表的交叉連接查詢時遇到問題。在C#中的數據表的交叉連接查詢中使用LINQ

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! 當我檢查結果時,連接記錄有多個重複,看起來過濾器實際上不能正常工作。

我想要做的是隻過濾那些在數據表中具有相同的StartX和StartY以及EndX和EndY的人。但是,我一直無法解決這個問題。

期待您的幫助。 乾杯。

+1

這聽起來像是工作完美,你只是沒有想到你得到的結果。我期望* lot *與這種類型的過濾器重複。你需要弄清楚你想要什麼,以及如何描述你想要的,以便我們能夠幫助你。 – Servy 2013-04-30 16:49:03

+0

如果要分組共享座標的項目,可以使用「group by」運算符。正如@Servy所說的那樣,你所追求的並不是特別清楚。 – jlew 2013-04-30 17:23:58

回答

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;