Следующий TSQL предоставляет пример того, как я мог бы решить эту проблему с SQL. Цель состоит в том, чтобы вернуть 1 строку на OID из левой таблицы, где количество записей в левой таблице равно количеству совпадающих строк в правой таблице.
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, который можно построить, или это невозможно? Обратите внимание на значение по умолчанию, данное для проверки в объявлении класса Road. В приведенном ниже примере настройки результат должен быть нулевым. Добавление еще одной дороги с правильными значениями приведет к возврату только одной. По крайней мере, это то, что идеально.
Проблема, с которой я столкнулся, заключается в том, что этот тип кода 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
}