C# 扩展相关子查询以在LINQ中包含另一个查询

C# 扩展相关子查询以在LINQ中包含另一个查询,c#,.net,linq,C#,.net,Linq,我试图扩展一个相关子查询,以便在LINQ中包含另一个查询。 在SQL中,这就是查询 SELECT V.Car_ID FROM VEHICLES V, AGREEMENTS A, AGREEMENTS A1 WHERE A.Car_ID = V.Car_ID AND enDate >= A.Hire_Start_Date AND stDate <= A.Hire_End_Date AND A1.CAR_ID = V.CAR_ID AND location = A1.Return_Loc

我试图扩展一个相关子查询,以便在LINQ中包含另一个查询。 在SQL中,这就是查询

SELECT V.Car_ID
FROM VEHICLES V, AGREEMENTS A, AGREEMENTS A1
WHERE A.Car_ID = V.Car_ID
AND enDate >= A.Hire_Start_Date
AND stDate <= A.Hire_End_Date
AND A1.CAR_ID = V.CAR_ID
AND location = A1.Return_Location
AND A1.Return_date =
 (SELECT MAX(A2.Return_Date)
 FROM AGREEMENT A2
 WHERE A2.VEHICLE_ID = V.VEHICLE_ID
 AND A2.Return_Date < stDate)**
选择V.Car\u ID
来自车辆V、协议A、协议A1
其中A.Car\u ID=V.Car\u ID
和enDate>=A.Hire\u Start\u日期

并且stDate您的Sql查询是一个内部联接,因此在Linq中您可以执行以下操作:

var cars =  from v in db.VEHICLEs
            from a in db.AGREEMENTs
            from a1 in db.AGREEMENTs
            where a.CAR_ID == v.CAR_ID
                && enDate >= a.HIRE_START_DATE
                && strtDate <= a.HIRE_END_DATE
                && a1.CAR_ID == v.CAR_ID
                && location == a1.RETURN_LOCATION
                && a1.RETURN_DATE == db.AGREEMENTs
                    .Where(a2 => a2.VEHICLE_ID == v.VEHICLE_ID)
                    .Max(a2 => a2.RETURN_DATE)
            select v.CAR_ID;
var cars=从v到db车辆
来自db协议中的a
来自db协议中的a1
其中a.CAR\u ID==v.CAR\u ID
&&enDate>=a.HIRE\u START\u日期
&&strtDate a2.VEHICLE\u ID==v.VEHICLE\u ID)
.Max(a2=>a2.返回日期)
选择v.CAR\u ID;

对于选择其他字段,您可以执行以下操作:
选择新的{CarId=v.CAR\u ID,…}
非常感谢您,derloopkat,您让我看到了!!!:-)

var cars=从v到db车辆
来自db协议中的a1
哪里任何(a=>(a.CAR\u ID==v.CAR\u ID
&&a.STATUS_OPEN==真
&&enDate>=a.HIRE\u START\u日期
&&strtDate a2.CAR\u ID==v.CAR\u ID)
.Max(a2=>a2.雇佣\结束\日期)
选择v;

除了Linq查询中缺少的sql部分外,请注意
符号。Linq查询似乎并不等同于您的sql查询。它选择的是在一段时间内没有开放协议的车辆,而sql查询则相反,但忽略开放状态。
AND A1.CAR_ID = V.CAR_ID
AND location = A1.Return_Location
AND A1.Return_date =
 (SELECT MAX(A2.Return_Date)
 FROM AGREEMENT A2
 WHERE A2.VEHICLE_ID = V.VEHICLE_ID
 AND A2.Return_Date < stDate)**
var cars =  from v in db.VEHICLEs
            from a in db.AGREEMENTs
            from a1 in db.AGREEMENTs
            where a.CAR_ID == v.CAR_ID
                && enDate >= a.HIRE_START_DATE
                && strtDate <= a.HIRE_END_DATE
                && a1.CAR_ID == v.CAR_ID
                && location == a1.RETURN_LOCATION
                && a1.RETURN_DATE == db.AGREEMENTs
                    .Where(a2 => a2.VEHICLE_ID == v.VEHICLE_ID)
                    .Max(a2 => a2.RETURN_DATE)
            select v.CAR_ID;
             var cars = from v in db.VEHICLEs                       
                   from a1 in db.AGREEMENTs
                   where !db.AGREEMENTs.Any(a => (a.CAR_ID == v.CAR_ID
                       && a.STATUS_OPEN == true
                       && enDate >= a.HIRE_START_DATE
                       && strtDate <= a.HIRE_END_DATE))
                       && a1.CAR_ID == v.CAR_ID
                       && schPickUpDepotID == a1.RETURN_LOCATION
                       && a1.HIRE_END_DATE == db.AGREEMENTs
                        .Where(a2 => a2.CAR_ID == v.CAR_ID)
                        .Max(a2 => a2.HIRE_END_DATE)
                   select v;