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