2017-06-13 3 views
1

私はカスタムオブジェクトのIQueryableを持っており、それらのオブジェクトに対してソートを実装したいと考えています。C#orderby IQueryable 2つの異なるプロパティLinQ

public class OrgObject : Entity 
{ 
    public string sortStr { get; set; } 
    public int sortVal { get; set; } 
    //... more different properties 
    public virtual List<LinkedObject> links {get; set;} 
} 

public class LinkedObject : Entity 
{ 
    public string sortStr { get; set; } 
    public int sortVal { get; set; } 
    //... more different properties 
} 

問題は、OrgObjectsの一部がsortStr(またはsortVal)のために価値がないですが、それはLinkedObjectのsortStrを取るべきである:ここで私は、データベースにあるオブジェクトの簡略化した形です。 これを達成するために別のゲッターを実装しようとしましたが、LINQはそれをサポートしていません。 私は使ってみました:

OrderBy(x => x.LinkedObject.sortStr).ThenBy(y => y.sortStr) 

どちらも動作しません。これをLINQで解決する方法はありますか?または他のクリーンで簡単なソリューションですか?または私は自分自身を実装する必要がありますか? ありがとうございます

+0

*それはLinkedObjectのsortStrを取る必要があります*正確にどの 'LinkedObject'は、あなたが考えているん - あなたのモデルによると、' OrgObject'が持つことができます。 ** 0、1以上** 'LinkedObject's? –

+0

これはカスタムオブジェクトでもあり、コードショーによく似ています。基本的に0,1またはそれ以上の値を持つことができますが、OrgObjectのsortStrおよびsortValがnullの場合、常に少なくとも1つあります。 – lupus

+0

つまり、あなたは 'FirstOrDefault'を求めていますか? –

答えて

1

LinkedObjectリストの最初またはデフォルトのオプションが必要な場合は、次のようにすることができます。

var ordering = o.OrderBy(x => x.sortStr ?? x.links.FirstOrDefault().sortStr); 

全例ここ:

var o = new List<OrgObject>() 
{ 
    { 
     new OrgObject() 
     { 
      sortStr = null, 
      sortVal = null, 
      links = new List<LinkedObject>() 
      { 
       new LinkedObject(){sortStr = "a", sortVal=1}, 
       new LinkedObject(){sortStr = "b", sortVal=2}, 
      } 

     } 
    }, 
    { 
     new OrgObject() 
     { 
      sortStr = "c", 
      sortVal = 3, 
      links = new List<LinkedObject>() 
      { 
       new LinkedObject(){sortStr = "a", sortVal=1}, 
       new LinkedObject(){sortStr = "b", sortVal=2}, 
      } 

     } 
    }, 
    { 
     new OrgObject() 
     { 
      sortStr = null, 
      sortVal = null, 
      links = new List<LinkedObject>() 
      { 
       new LinkedObject(){sortStr = "d", sortVal=1}, 
       new LinkedObject(){sortStr = "e", sortVal=2}, 
      } 

     } 
    }, 
}; 

var ordering = o.OrderBy(x => x.sortStr ?? x.links.FirstOrDefault().sortStr); 
+0

sryのソートに変更できることを意味します。以前はあなたのコメントが表示されませんでした。これは、ユーザーが選択できるいくつかのプロパティーを持っているので、切り替わります。しかし、あなたの答えは素晴らしいと最初のプロパティのためにそれはすでに動作します。私は他の人のためにそれを試し、あなたを最新の状態に保ちます。どうも! – lupus

+0

それは魅力のように機能します。確かめるのは少し難しかったですが、私はこれがまさに私が探していたものだと確信しています。 – lupus

0

カスタムロジックを実行するOrgObjectにはIComparable<OrgObject>を実装しても構いません。.OrderBy(x=>x)を実行してください。

+0

ソートしたいものを切り替えるにはどうすればいいですか?ユーザーがソートすることを選択できるプロパティはいくつかあります(フロントエンド)。これは、最初にsortStrをソートし、sortVal – lupus

関連する問題