以下TSQL提供的我會如何解決這個問題,SQL的例子。目標是從左表中返回每個OID 1行,其中左表中的記錄計數等於右表中匹配行的計數。LINQ左連接與分組並具有轉換這個TSQL
SELECT cs.OID, Count(cs.OID) AS CarCount, Sum(RS.Check) AS RoadCount
FROM Cars AS cs
LEFT JOIN Roads AS RS
ON CS.oid = RS.OID
AND cs.RID = RS.RID
GROUP BY cs.OID
HAVING Count(cs.OID) = Sum(RS.Check)
使用下面的對象設置,是否有一個可以構建的等價的LINQ查詢,或者這是不可能的?注意道路類聲明中檢查的默認值。在下面的設置示例中,結果應該是零匹配。添加一個具有適當值的道路將使它返回一個。至少這是理想的。
我所遇到的問題是,它似乎這種類型的TSQL代碼只是太複雜,LINQ。我還沒有找到明顯或非顯而易見的解決方案來實現類似的行爲。因此,我認爲解決方案可能是停止嘗試複製SQL並做一些不同的事情。沒有足夠的LINQ經驗,我不知道從哪裏開始。
public class Roads : List<Road>{}
public class Road
{
public int RID;
public int OID;
public int check = 1;
}
public class Cars : List<Car> { }
public class Car
{
public int RID;
public int OID;
}
private void CheckCheck()
{
Roads rs = new Roads();
Cars cs = new Cars();
Car c = new Car();
c.OID = 1;
c.RID = 1;
cs.Add(c);
c = new Car();
c.OID = 1;
c.RID = 2;
cs.Add(c);
c = new Car();
c.OID = 1;
c.RID = 3;
cs.Add(c);
Road r = new Road();
r.OID = 1;
r.RID = 1;
rs.Add(r);
r = new Road();
r.OID = 1;
r.RID = 2;
rs.Add(r);
// Results should be :
// OID where Count of OID from C = Count of OID from R
}
尼斯使用的查找。我總是忽視那種方法。 – Sorax 2010-11-12 20:25:46
我會試一試並提供反饋。此示例是更復雜的查詢的簡化版本,但具有特定的問題點。注意cs.OID在汽車中是獨一無二的,所以不需要區分。這個想法是我在左表中有3行,並且我想只在右表中匹配3行時才返回一行。因此,對於非匹配,SQL(rs.check)中的Count(CS.OID)和SUM(rs.check)將爲空,並且SQL忽略總和中的空值。 – MikeH 2010-11-12 21:20:43
如果您加入... cs.OID在結果中不會是唯一的。而且由於你忽略了空值,所以你不需要使用LEFT JOIN來爲你忽略空值。 – 2010-11-12 21:30:47