2010-06-11 28 views
46

Birden çok koşulda C#' da bir LINQ Katılma ifadem var.LINQ Birden çok koşulla C# 'ya katılma

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 }; 

Birleştirme doğru çalışmıyor. Neyi yanlış yapıyorum?

+2

Am bu okunamaz var sadede diye düşünerek yanlış? Sadece biçimlendirme olabilir. Bu tamamen konu dışı ve bunun için özür dilerim. –

+0

cevabınız varsa, lütfen bunu işaretleyin. Sorgunuzun çalışması için, değişkenlerinize aynı ismi verin ve bunları projeksiyonlarınıza (Zar Shardan'ın cevabındaki gibi) eşitlemeniz ve en iyi yanıt için p.campbell'in cevabındaki gibi nerede olduğunu düzeltin) – ericosg

cevap

5

, where maddesinde olmalıdır.

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

sadece bu şekilde katılabilir AFAIK

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

olmalıdır:

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 
    } 

ana gereksinimleri şunlardır: anonim içinde Mülkiyet isimleri, tipleri ve sipariş Nesnelerinizi' e katılmadan eşleşmelidir.

Katılmalarda AND' OR'leri vb. Kullanamazsınız. Sadece object1, object2'ye eşittir. Bu linqpad örnekte

Daha ileri şeyler:

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}; 
} 

isim ve mülkiyet düzeni hitaben adresleme türleri döküm/dönüştürme/ayrıştırma/çağırma yöntemlerinin vb Bu her zaman LINQ ile çalışmayabilir yoluyla basit sağlanabilir edilir EF veya SQL veya NHibernate, çoğu yöntem çağrıları kesinlikle işe yaramaz ve çalışma zamanında başarısız olur, bu yüzden YMMV. Bunun nedeni, anonim nesnelere ait salt okunur özelliklerine kopyalanmalarıdır, bu nedenle ifadeniz birleştirme özelliklerinde doğru türde değerler ürettiği sürece - iyi olmanız gerekir.

+1

+1 – ericosg

+4

alan adlarının eşleşmesi gerektiğinden emin olursanız, –

+0

Teşekkürler Daniel değilse, bir tür çıkarım hatası alırsınız, doğru, cevabınızı notlarınızı yansıtacak şekilde güncellediniz ve başka bir daha gelişmiş örnek eklediniz. –

0

Eğer eşit nesne koşulu kullanımı çapraz dizileri katılamaz gerekirse:

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