LINQ以多种条件加入C#

Rat*_*esh 54 c# linq join multiple-conditions

我在C#中有一个LINQ Joining语句,有多个条件.

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 };
Run Code Online (Sandbox Code Playgroud)

加入无法正常工作.我究竟做错了什么?

Zar*_*dan 97

AFAIK你只能这样加入:

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
    }
Run Code Online (Sandbox Code Playgroud)

主要要求是:您加入的匿名对象中的属性名称,类型和顺序必须匹配.

您不能在连接中使用ANDs 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};
}
Run Code Online (Sandbox Code Playgroud)

寻址名称和属性顺序很简单,寻址类型可以通过转换/转换/解析/调用方法等来实现.这可能并不总是适用于LINQ to EF或SQL或NHibernate,大多数方法调用肯定不起作用并且会在运行时,所以YMMV.这是因为它们被复制到匿名对象中的公共只读属性,因此只要表达式生成正确类型的值为join属性 - 您应该没问题.

  • 非常确定字段名称需要匹配,如果不是,则会出现类型推断错误 (4认同)

p.c*_*ell 5

and应该&&where条款中.

where epl.DepartAirportAfter >  sd.UTCDepartureTime 
and epl.ArriveAirportBy > sd.UTCArrivalTime
Run Code Online (Sandbox Code Playgroud)

应该

where epl.DepartAirportAfter >  sd.UTCDepartureTime 
&& epl.ArriveAirportBy > sd.UTCArrivalTime
Run Code Online (Sandbox Code Playgroud)