Следующий TSQL представляет собой пример того, как я могу решить эту проблему с SQL. Цель состоит в том, чтобы вернуть 1 строку на OID из левой таблицы, где количество записей в левой таблице равно количеству совпадающих строк в правой таблице.LINQ Left Join with Grouping and Convert this 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 запрос, который может быть построен, или это не возможно? Обратите внимание на значение по умолчанию, указанное для проверки в объявлении класса 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
}
Приятное использование Lookups. Я всегда пропускаю этот метод. – Sorax
Я дам ему попытку и обратную связь. Этот образец был упрощенной версией более сложного запроса, но имел особые проблемы. Примечание. Cs.OID уникален в Cars, поэтому нет необходимости в отличном использовании. Идея состоит в том, что у меня 3 строки в левой таблице, и я хочу вернуть строку только в том случае, если у меня также есть соответствующие 3 строки в правой таблице. Таким образом, Count (CS.OID) и SUM (rs.check) - в SQL, rs.check будет иметь значение null для не совпадений, а SQL игнорирует нули в сумме. – MikeH
Если вы присоединяетесь ... cs.OID не будет уникальным в результате. И поскольку вы игнорируете нули, вам не нужно LEFT JOIN, чтобы игнорировать NULL. –