2009-05-29 2 views
1

を並べ替えるにはどうすればよいあなたは、MSDNのドキュメントはのEntitySetはIBindingListを実装していることを述べているのEntitySet <T>

明らかなEntitySetが実装されていないことがわかる。しかし、

http://msdn.microsoft.com/en-us/library/bb546190.aspxで「EntitySetsへの結合」を参照)このインタフェース!

どうすればソートできますか?

コンテキストでは、このセットをWPF ListViewにバインドします。

私が解決しようとしている問題の広いコンテキストについては、this postを参照してください。

答えて

7

EntitySet <T>は、IBindingListを実装していません... IBindingListを取得するメソッドを提供します。バインディングリスト<T>のインスタンスを取得するには、.GetNewBindingList()を呼び出す必要があります。 EntitySetBindingListはオリジナルのEntitySet <T>のラッパーです。元のEntitySetの変更はすべて元のEntitySetに変更されています。

EDIT:するBindingListでソート:

するBindingListで並べ替えるには、次のようにソートできるようにするインターフェイスのいくつかの種類を公開する必要があります。ソートはBindingList <T>クラスでサポートされていますが、保護されたプロパティとメソッドを使用します。ラッパーで表情豊かなソート方法を公開することが可能です:

public class EntitySetBindingWrapper<T>: BindingList<T> 
{ 
    public EntitySetBindingWrapper(BindingList<T> root) : base(root) 
    { 
    } 

    public void Sort(Expression<Func<T, P>> expr, ListSortDirection direction) 
    { 
     if (expr == null) 
      base.RemoveSortCore(); 

     MemberExpression propExpr = expr as MemberExpression; 
     if (propExpr == null) throw new ArgumentException("You must provide a property", "expr"); 

     PropertyDescriptorCollection descriptorCol = TypeDescriptor.GetProperties(typeof(T)); 
     IEnumerable<PropertyDescriptor> descriptors = descriptorCol.Cast<PropertyDescriptor>(); 
     PropertyDescriptor descriptor = descriptors.First(pd => pd.Name == propExpr.Member.Name); 

     base.ApplySortCore(descriptor, direction); 
    } 
} 

あなたがそのようにのように並べ替えることができる必要があります:

var bindingWrapper = new EntitySetBindingWrapper(myEntitySet.GetNewBindingList()); 
bindingWrapper.Sort(e => e.MyProperty, ListSortDirection.Ascending); 

listView.DataSource = bindingWrapper; 

EntitySetBindingWrapperクラスのための追加的な実装があるかもしれません... BindingListの任意の通常のパブリックメソッドをコンストラクタに提供されているメソッドに転送するなどの操作を行います。

+0

ありがとう、私は暗い路地に私を連れて行くだろうとは思わない。質問の一番下にリンクされている投稿を読んでいると、おそらくデータバインディングという点で私が見逃していることがあります。 –

+0

他の投稿を読んだ後、彼は.ToList()を呼び出す間違いをしました。バインディング・ソースはおそらくその基礎となるリストを更新していましたが、そのリストはEntitySetではありませんでした。 .ToListを呼び出すと、新しいリストオブジェクトが作成されます。 BindingListは並べ替えをサポートしています...多少古風な形です...しかし、それは公開されなければなりません。 GetNewBindingList()によって返されたものをラップし、SortPropertyCoreおよびSortDirectionCoreを公開できるBindingListラッパーを作成する必要があります。私は例を挙げて別の答えを投稿します。 – jrista

+0

EntitySet は、上記のGetNewBindingList()に委譲して(そしてIBindingListの結果をキャッシュして)IListSource.GetList()を実装します。 BindingSourceを使用してEntitySet をWinForms DataGridViewにバインドすると、自動的に列の並べ替えがサポートされます。 WPFについてはわかりませんが、同様に動作すると思っていたでしょう。 – Lucas

0

できますか.ToList()。OrderBy(x => x.FieldToSortBy)?

+0

もちろん、別のプロパティを作成することを意味します。 –

0

ハインシー - ビニーのポストへのあなたのコメントで判断すると、私はあなたのポイントを見逃していると思う... [私はあなたの質問への答えとしてこれを提示していない、私はちょうどビニーのポイント。]それに関するいかなる可能な混乱アップ

このオブジェクトを考えてみましょう:

public class Person 
{ 
    public string FirstName; 
    public string MiddleInitial; 
    public string LastName; 

    public DateTime DateOfBirth { get; set; } 

    public int Age 
    { 
     get 
     { 
      return (int)DateTime.Today.Subtract(DateOfBirth).TotalDays/365; 
     } 
    } 
} 

、私は人々

var people = new List<Person>(); 

そしてIまし呼ばれる設定した人のリストを持っていると仮定私のリストにはたくさんの人がいます。

var sortedByLastName = people.OrderBy(o => o.LastName); 
var sortedByFirstName = people.OrderBy(o => o.FirstName); 
var sortedByAge = people.OrderBy(o => o.Age); 
var sortedByAgeDesc = people.OrderByDescending(o => o.Age); 
var sortedByLastThenFirst = people.OrderBy(o => o.LastName).ThenBy(o => o.FirstName); 

これは、複雑なオブジェクト用です。私たちは、文字列のようないくつかのプリミティブ型のリスト、持っていれば:私は自分自身に基づいてそれらをソートする

var strings = new List<string>(); 

を -

var sorted = strings.OrderBy(s => s); 

これがソートされます私のオブジェクトの一部のプロパティではない、すなわち、オブジェクト上にIComparableを実装する複雑なオブジェクトをソートして、デフォルトの比較元でソートする場合も、同じ考え方を使用することができます。

プリミティブ型でも複雑なオブジェクトでも、EntitySetは同様の方法でソートできます。

+0

こんにちは、ありがと...しかし、私の質問のポイントは、EntitySetを直接ソートする方法を見つける方法でした。私はリストをソートする方法を知っています。私が「それは別の物件を作ることを意味する」と言ったとき、私は* on *の物件を意味するわけではありませんでした。 質問の一番下にリンクしている投稿を読むと、問題はもう少し複雑になります。 –

1

オーダービーディーディング!

var tags = objContext.Tags; 
gvTester.DataSource = tags.OrderByDescending(x => x.TagID); ; 
gvTester.DataBind(); 
関連する問題