Из запроса, который вы опубликовали, я понимаю ваши модели:
public class Acs_Transaction_New_class
{
public DateTime Date {get; set;}
public string acs_operations {get; set;}
public int acs_rfid_no {get; set;}
public int acs_vehicle_id {get; set;}
public DateTime acs_datetime {get; set;}
}
public class PassLinking_Class
{
public int RfidNumber { get; set; }
public int VehicleID { get; set; }
}
Свободный синтаксис:
// Data Placeholders to compile linq query
var result = Acs_Transaction_New
.Join(Acs_Transaction_New, acs => acs.Date, acsout => acsout.Date, (acs, acsout) => new { acs, acsout })
.Where(x => x.acs.acs_operations == "in" && x.acsout.acs_operations == "out")
.Join(PassLinkings, x => new { rfid = x.acs.acs_rfid_no, vehicleid = x.acs.acs_vehicle_id }, linking => new { rfid = linking.RfidNumber, vehicleid = linking.VehicleID}, (x, linking) => new { x.acs, x.acsout,linking })
.GroupBy(x => new { x.linking.RfidNumber, x.linking.VehicleID, x.acs.Date })
.Select(x => new
{
x.Key.RfidNumber,
x.Key.VehicleID,
x.Key.Date,
acs_min_datetime = x.Min(y => y.acs.acs_datetime),
acs_max_datetime = x.Max(y => y.acsout.acs_datetime)
});
Важные моменты:
- Свободный синтаксис гораздо более многословен, чем синтаксис запроса, но обеспечивает четкое каскадирование данных, поэтому его легче воспринимать
- Из запроса Sql я перевел
acs_operations == "in" / "out"
как условие «Где» вместо «Соединение», в идеале нам не нужно сравнивать с «in» и «out» дважды
Синтаксис запроса:
var result = from acs in Acs_Transaction_New
join acsout in Acs_Transaction_New on acs.Date equals acsout.Date
where acs.acs_operations == "in" && acsout.acs_operations == "out"
join link in PassLinkings on new { rfid = acs.acs_rfid_no, vehicleid = acs.acs_vehicle_id } equals new { rfid = link.RfidNumber, vehicleid = link.VehicleID}
group new {acs,acsout } by new { link.RfidNumber, link.VehicleID, acs.Date } into group1
select new
{
group1.Key.RfidNumber,
group1.Key.VehicleID,
group1.Key.Date,
acs_min_datetime = group1.Min(y => y.acs.acs_datetime),
acs_max_datetime = group1.Max(y => y.acsout.acs_datetime)
};
Обе версии Query компилируются, поэтому синтаксически правильны, вам просто нужно внести изменения в соответствии с вашим вариантом использования