2010-11-22 2 views
2
私は同じことを行う必要があり

Entity Framework 4とLinq:OrderByはQuery:refactor my codeにネストされたフィールド

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

はまず、Thomas Levesqueは関係が常に存在ではないかもしれない関連テーブルのフィールドを注文するための良い解決策を持っていました。私の集約ルートは膨大である:

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

は、これは本当にこれを行う方法です、または、より読みやすいものがありますか?私の他の問題は、ネストされたmyFieldでもmyFieldでで指定されたトップレベルのクエリに座っマッチング「デフォルト」の値を、持っていることです。アイデアは、これらの2つのフィールド(?)の合体によって注文することでした。

編集:私はこれが最初のフィールドから「デフォルト値」を含んだと思う:

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

にはどうすればきれいになるこの[並べ替えを書き換えることができますか?このコードは、のエラーで失敗する「タイプの要素を比較することはできません 『System.Collections.Generic.IEnumerable`1』のみ原始的(なのInt32、文字列、およびGUIDなど)の種類とエンティティタイプがサポートされています。」

+2

の内側まあ、多分あなたはどこかにこの問題を解決しようとする必要があります。あなたは4つの関係をナビゲートする必要がありますか?より適切な形式でデータを取得できるように、データベースおよび/またはマッピングを変更することはできませんか? –

+0

私は常にビューやストアドプロシージャを追加できますが、最終的な結果はクライアントに向かう階層JSONオブジェクトです。だから、私は平坦化されたオブジェクトから階層を作り直すことになります。 –

答えて

2

ここではかなり厄介なコードの匂いがしていると思いますが、あなたが持っているもので作業すると、このようなLINQクエリではこれを処理できません。ただ、読みやすさのために私は

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

ような何かをしたいとPのクラス

private bool HasValidFields 
{ 
    get 
    { 
    return p.Seconds != null && 
      p.Seconds.FirstOrDefault() != null && 
      .... ; 
    } 
} 
関連する問題