本文介绍了LINQ 在 C# 中加入多个条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a LINQ Joining statement in C# with multiple 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 };

加入工作不正常.我做错了什么?

The joining does not work correctly. What am I doing wrong?

推荐答案

据我所知,你只能这样加入:

As far as I know you can only join this way:

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.

You CAN'T use ANDs, ORs, etc. in joins. Just object1 equals object2.

此 LinqPad 示例中的更多高级内容:

More advanced stuff in this LinqPad example:

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,大多数方法调用肯定不起作用,并且将在运行时失败,因此 YMMV(您的里程可能会有所不同).这是因为它们被复制到匿名对象中的公共只读属性中,所以只要您的表达式产生正确类型的值 join 属性 - 您应该没问题.

Addressing names and property order is straightforward, addressing types can be achieved via casting/converting/parsing/calling methods etc. This might not always work with LINQ to EF or SQL or NHibernate, most method calls definitely won't work and will fail at run-time, so YMMV (Your Mileage May Vary).This is because they are copied to public read-only properties in the anonymous objects, so as long as your expression produces values of correct type the join property - you should be fine.

这篇关于LINQ 在 C# 中加入多个条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-05 08:57