multiple left inner framework conditions c# linq join multiple-conditions

left - join linq c# multiple



LINQ Unirse en C#con mĂșltiples condiciones (3)

Tengo una declaración de LINQ Joining en C # con múltiples condiciones.

var possibleSegments = from epl in eventPotentialLegs join sd in segmentDurations on new { epl.ITARequestID, epl.ITASliceNumber, epl.DepartAirportAfter, epl.AirportId_Origin, epl.AirportId_Destination } equals new { sd.ITARequestId, sd.SliceIndex, sd.OriginAirport, sd.DestinationAirport } where epl.DepartAirportAfter > sd.UTCDepartureTime and epl.ArriveAirportBy > sd.UTCArrivalTime select new PossibleSegments{ ArrivalTime = sd.arrivalTime };

La unión no funciona correctamente. ¿Qué estoy haciendo mal?


AFAIK solo puedes unirte de esta manera:

var query = from obj_i in set1 join obj_j in set2 on new { JoinProperty1 = obj_i.SomeField1, JoinProperty2 = obj_i.SomeField2, JoinProperty3 = obj_i.SomeField3, JoinProperty4 = obj_i.SomeField4 } equals new { JoinProperty1 = obj_j.SomeOtherField1, JoinProperty2 = obj_j.SomeOtherField2, JoinProperty3 = obj_j.SomeOtherField3, JoinProperty4 = obj_j.SomeOtherField4 }

Los requisitos principales son: los nombres de propiedad, los tipos y el orden en los objetos anónimos en los que se une deben coincidir.

NO PUEDE usar ANDs ORs, etc. en combinaciones. Solo object1 es igual a object2.

Cosas más avanzadas en este ejemplo de LinqPad:

class c1 { public int someIntField; public string someStringField; } class c2 { public Int64 someInt64Property {get;set;} private object someField; public string someStringFunction(){return someField.ToString();} } void Main() { var set1 = new List<c1>(); var set2 = new List<c2>(); var query = from obj_i in set1 join obj_j in set2 on new { JoinProperty1 = (Int64) obj_i.someIntField, JoinProperty2 = obj_i.someStringField } equals new { JoinProperty1 = obj_j.someInt64Property, JoinProperty2 = obj_j.someStringFunction() } select new {obj1 = obj_i, obj2 = obj_j}; }

El direccionamiento de nombres y el orden de propiedad es sencillo, los tipos de direccionamiento pueden lograrse a través de casting / conversión / análisis / métodos de llamada, etc. Esto puede no funcionar siempre con LINQ a EF o SQL o NHibernate, la mayoría de las llamadas a métodos definitivamente no funcionarán y fallarán a tiempo de ejecución, entonces YMMV. Esto se debe a que se copian en propiedades públicas de solo lectura en los objetos anónimos, por lo que siempre que su expresión produzca valores del tipo correcto, la propiedad de unión: debería estar bien.


Si no necesita una condición de objeto igual, use secuencias de combinación cruzada:

var query = from obj1 in set1 from obj2 in set2 where obj1.key1 == obj2.key2 && obj1.key3.contains(obj2.key5) [...conditions...]


Tu and debería ser un && en la cláusula where .

where epl.DepartAirportAfter > sd.UTCDepartureTime and epl.ArriveAirportBy > sd.UTCArrivalTime

debiera ser

where epl.DepartAirportAfter > sd.UTCDepartureTime && epl.ArriveAirportBy > sd.UTCArrivalTime