LINQ Rejoindre en C # avec plusieurs conditions

J’ai une instruction de jointure LINQ en C # avec plusieurs conditions.

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 jonction ne fonctionne pas correctement. Qu’est-ce que je fais mal?

AFAIK vous ne pouvez que rejoindre cette façon:

 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 } 

Les principales exigences sont les suivantes: Les noms de propriété, les types et l’ordre des objects anonymes auxquels vous vous connectez doivent correspondre.

Vous NE POUVEZ PAS utiliser les ORs OR etc. dans les jointures. Juste object1 est égal à object2.

Des choses plus avancées dans cet exemple LinqPad:

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

L’adressage des noms et de l’ordre des propriétés est simple, les types d’adressage peuvent être réalisés via des méthodes de conversion / conversion / parsing / appel, etc. Cela peut ne pas toujours fonctionner avec LINQ to EF ou SQL ou NHibernate. run-time, donc YMMV. Cela est dû au fait qu’ils sont copiés dans les propriétés publiques en lecture seule des objects anonymes. Aussi longtemps que votre expression produit des valeurs correctes, tapez la propriété join – vous devriez vous en sortir.

Votre and devrait être un && dans la clause where .

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

devrait être

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

Si vous n’avez pas besoin d’égaler la condition d’object, utilisez des séquences de jointure croisée:

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