2009-05-29 2 views
1

Die MSDN-Dokumentation besagt, dass ein EntitySet IBindingList implementiertWie sortieren Sie EntitySet <T>

(siehe 'Die Bindung an EntitySets' bei http://msdn.microsoft.com/en-us/library/bb546190.aspx)

kann jedoch deutlich, dass ein EntitySet nicht implementieren ist zu sehen diese Schnittstelle!

Also, wie sortiere ich?

Für Kontext bin ich dieses Set an eine WPF ListView binden.

Für einen größeren Kontext des Problems, das ich versuche zu lösen, sehen Sie bitte this post.

Antwort

7

EntitySet <T> implementiert nicht IBindingList ... es bietet eine Methode zum Abrufen einer IBindingList. Sie müssen .GetNewBindingList() aufrufen, um eine Instanz von EntitySetBindingList <T> zu erhalten, die von SortableBindingList <T> abgeleitet ist, die eine BindingList <T> T > ist. EntitySetBindingList ist nur ein Wrapper um das ursprüngliche EntitySet <T>, aus dem es erstellt wurde, so dass alle Änderungen an dem ursprünglichen EntitySet vorgenommen werden.

EDIT: Sortierung mit Binding:

mit einem Binding zu sortieren, müssen Sie irgendeine Art von Schnittstelle belichten Sortierung zu ermöglichen. Die Sortierung wird innerhalb der BindingList <T> Klasse unterstützt, aber durch geschützte Eigenschaften und Methoden.Es sollte möglich sein, eine ausdrucksvolle Sortiermethode mit einem Wrapper zu entlarven:

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

Sie sollten dann in der Lage sein, wie so zu sortieren:

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

listView.DataSource = bindingWrapper; 

Es könnte zusätzliche Implementierung für die EntitySetBindingWrapper Klasse sein ... wie etwa das Weiterleiten von normalerweise öffentlichen Methoden an BindingList T> an die für den Konstruktor bereitgestellte.

+0

Danke, ich bin mir nicht sicher, ob das mich in eine dunkle Gasse bringt. Wenn Sie den Beitrag lesen, mit dem ich mich am Ende der Frage verbunden habe, fehlt wahrscheinlich etwas, was ich im Zusammenhang mit der Datenbindung verstehe. –

+0

Also, nachdem er diesen anderen Beitrag gelesen hatte, machte er den Fehler, .ToList() aufzurufen. Die Bindungsquelle hat wahrscheinlich ihre zugrunde liegende Liste aktualisiert, aber diese Liste war nicht das EntitySet. Durch Aufruf von .ToList wird ein neues Listenobjekt erstellt. BindingList unterstützt das Sortieren ... etwas von einer archaischen Form ... aber es muss belichtet werden. Sie müssten einen BindingList-Wrapper erstellen, der die von GetNewBindingList() zurückgegebenen Whats-Wraps umbrechen und SortPropertyCore und SortDirectionCore verfügbar machen kann. Ich werde eine andere Antwort mit einem Beispiel posten. – jrista

+0

EntitySet implementiert IListSource.GetList() durch Delegieren an die GetNewBindingList(), die Sie erwähnten (und Zwischenspeichern des IBindingList-Ergebnisses). Wenn Sie ein EntitySet über eine BindingSource an ein WinForms DataGridView binden, erhalten Sie automatisch Unterstützung für die Spaltensortierung. Ich weiß nichts über WPF, aber ich hätte gedacht, dass es ähnlich funktionieren würde. – Lucas

0

Können Sie .ToList(). OrderBy (x => x.FieldToSortBy)?

+0

Natürlich, aber das bedeutet, eine andere Eigenschaft zu erstellen. –

0

Hainesy - Nach deinem Kommentar zu Vinnys Post verkennend, verkennst du, dass du seinen Punkt verpasst ... [Ich präsentiere dies nicht als direkte Antwort auf deine Frage, sondern erläutere nur Vinnys Punkt, den ich klären muss eine mögliche Verwirrung in Bezug auf die oben]

Betrachten Sie dieses Objekt.

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

jetzt gehe ich davon aus, eine Liste von Person einrichten genannt Menschen haben

var people = new List<Person>(); 

Und ich habe Ich habe eine ganze Menge Leute auf meiner Liste.

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

Das ist für komplexe Objekte. Wenn wir eine Liste von einigen primitiven Typ, wie eine Zeichenfolge haben:

var strings = new List<string>(); 

Ich möchte sie sortieren basierend auf sich selbst - also nicht durch eine Eigenschaft meiner Objekt

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

Dies wird sortieren auf dem Objekt. Sie können die gleiche Idee auch verwenden, wenn Sie komplexe Objekte sortieren, die IComparable zum Sortieren nach ihrem Standardvergleichsprogramm implementieren.

Ein EntitySet kann auf ähnliche Weise sortiert werden, ob für einen primitiven Typ oder ein komplexes Objekt.

+0

Hallo, danke ... aber der Punkt meiner Frage war, wie man herausfinden kann, wie man ein EntitySet direkt sortiert. Mir ist bewusst, wie man eine Liste sortiert. Als ich sagte "das bedeutet, eine andere Eigenschaft zu schaffen", meinte ich nicht die Eigenschaft, auf * on * zu sortieren. Das Problem ist ein wenig komplexer, wenn Sie den Post lesen, mit dem ich am Ende der Frage verbunden bin. –

Verwandte Themen