C# 具有多个条件的LINQ连接

C# 具有多个条件的LINQ连接,c#,linq,join,multiple-conditions,C#,Linq,Join,Multiple Conditions,我在C中有一个LINQ连接语句,有多个条件 var possibleSegments = from epl in eventPotentialLegs join sd in segmentDurations on new { epl.ITARequestID, epl.ITASliceNumber, epl.DepartAirportAfter, epl.A

我在C中有一个LINQ连接语句,有多个条件

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 };
接头工作不正常。我做错了什么?

您的and应该是where子句中的&&

应该是

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

据我所知,您只能通过以下方式加入:

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
    }
主要要求是: 要加入的匿名对象中的属性名称、类型和顺序必须匹配

不能在联接中使用AND、OR等。只是object1等于object2

本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};
}
寻址名称和属性顺序很简单,寻址类型可以通过强制转换/转换/解析/调用方法等实现。这可能并不总是适用于LINQ to EF或SQL或NHibernate,大多数方法调用肯定不起作用,并且在运行时会失败,因此您的里程可能会有所不同。
这是因为它们被复制到匿名对象中的公共只读属性中,因此只要表达式生成正确类型的值,连接属性-就可以了。

如果不需要相等的对象条件,请使用交叉连接序列:

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

我是否错误地认为这可能会导致无法阅读?可能只是格式问题。这完全是离题的,对此我深表歉意。如果你得到了答案,请注明。为了使查询正常工作,您需要将变量命名为相同的名称,并将它们等同于Zar Shardan的答案中的预测,还需要修复p.campbell的答案中的where子句。非常确定字段名称需要匹配,如果它们不匹配,则会出现类型推断错误。Daniel,您是正确的,更新了答案以反映您的笔记,并添加了另一个更高级的示例。感谢提供全面的示例
var query = from obj1 in set1
from obj2 in set2
where obj1.key1 == obj2.key2 && obj1.key3.contains(obj2.key5) [...conditions...]