以下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