2010-11-22 11 views
2

İlk olarak, Thomas Levesque, ilişkinin her zaman orada bulunmayabileceği ilgili bir tablodaki alanları sipariş etmek için iyi bir çözüm buldu:Varlık Framework 4 ve Linq: OrderBy Query'de bir alanın içine yerleştirildi: kodumu refactor

userQuery = userQuery.OrderBy(u => 
    (u.Department != null) ? u.Department.Name : String.Empty); 

Aynı şeyi yapmam gerekiyor. Toplam köküm çok büyük:

myQuery = myQuery.OrderBy(p => 
    (p.Seconds == null 
    ? 0 
    : p.Seconds.FirstOrDefault() == null 
     ? 0 
     : p.Seconds.First().Thirds == null 
     ? 0 
     : p.Seconds.First().Thirds.FirstOrDefault() == null 
      ? 0 
      : p.Seconds.First().Thirds.First().Forths == null 
      ? 0 
      : p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null 
       ? 0 
       : p.Seconds.First().Thirds.First().Forths.First().myField)); 

Bu gerçekten bunu yapmanın yolu mu yoksa okunması daha kolay bir şey mi var? Diğer sorunum ise, iç içe geçmiş myField öğesinin, myField tarafından da adlandırılan en üst düzey Sorguda oturan eşleşen "varsayılan" değere sahip olmasıdır. Bu fikir, bu iki alanın (??) birleşimiyle Düzenlemekti.

Düzenleme: Bu, ilk alandan "varsayılan değer" ifadesini içerecektir:

myQuery = myQuery.OrderBy(p => 
    (p.Seconds == null 
    ? p.myDefaultField // Used to be zero 
    : p.Seconds.FirstOrDefault() == null 
     ? p.myDefaultField 
     : p.Seconds.First().Thirds == null 
     ? p.myDefaultField 
     : p.Seconds.First().Thirds.FirstOrDefault() == null 
      ? p.myDefaultField 
      : p.Seconds.First().Thirds.First().Forths == null 
      ? p.myDefaultField 
      : p.Seconds.First().Thirds.First().Forths.FirstOrDefault() == null 
       ? p.myDefaultField 
       : p.Seconds.First().Thirds.First().Forths.First().myField)); 

Bu OrderBy'yi nasıl temizlerim? Bu kod, "System.Collections.Generic.IEnumerable`1" türündeki öğeleri karşılaştıramıyor. Yalnızca ilkel türler (Int32, String ve Guid gibi) ve varlık türleri destekleniyor. "

+2

Eh ait

myQuery = myQuery.OrderBy(p => (p.HasValidFields() ? p.Seconds.First().Thirds.First().Forths.First().myField : p.myDefaultField )); 

gibi bir şey Ve içeride yapardım, belki başka bir yerde bu sorunu çözmeye çalışıyor olmalıdır. Dört ilişkide gezinmeniz gerektiğinden emin misiniz? Veritabanını ve/veya eşlemeleri, verileri daha uygun bir biçimde almanız için değiştiremez misiniz? –

+0

Her zaman bir görünüm ve/veya saklı yordam ekleyebilirim, ancak sonuç, istemciye giden bir hiyerarşik JSON nesnesidir. Bu yüzden düzleştirilmiş bir nesneden bir hiyerarşi yeniden yaratırdım. –

cevap

2

Burada oldukça kötü bir kod kokusuna sahip olduğunuzu düşünüyorum, ancak elinizde olanlarla çalışıyorum, bunu böyle bir LINQ sorgusunda kullanamam. Sadece okunabilirliği uğruna ben p'nin sınıfında

private bool HasValidFields 
{ 
    get 
    { 
    return p.Seconds != null && 
      p.Seconds.FirstOrDefault() != null && 
      .... ; 
    } 
}