Как вы сортируете EntitySet<T>

В документации MSDN говорится, что EntitySet реализует IBindingList

(см. "Привязка к EntitySets" по адресу http://msdn.microsoft.com/en-us/library/bb546190.aspx).

Однако, ясно видно, что EntitySet не реализует этот интерфейс!

Так как мне сортировать?

Для контекста я связываю этот набор с WPF ListView.

Для более широкого контекста проблемы, которую я пытаюсь решить, пожалуйста, смотрите этот пост.

4 ответа

Решение

EntitySet не реализует IBindingList... он предоставляет метод для получения IBindingList. Вам нужно вызвать.GetNewBindingList(), чтобы получить экземпляр EntitySetBindingList, который является производным от SortableBindingList, который является BindingList. EntitySetBindingList - это просто оболочка вокруг исходного EntitySet, из которого он был создан, поэтому любые его изменения являются модификациями исходного EntitySet.

РЕДАКТИРОВАТЬ: сортировка с BindingList:

Для сортировки с помощью BindingList вам нужно предоставить какой-то интерфейс, чтобы разрешить сортировку. Сортировка поддерживается в классе BindingList, но с помощью защищенных свойств и методов. Должна быть возможность выставить экспрессивный метод сортировки с помощью обертки:

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 к тому, который предоставлен конструктору.

OrderByDecending!

var tags = objContext.Tags;
gvTester.DataSource = tags.OrderByDescending(x => x.TagID); ;
gvTester.DataBind();

Не могли бы вы сделать.ToList().OrderBy(x=>x.FieldToSortBy)?

Хейнси - судя по твоему комментарию к посту Винни, я думаю, что ты упускаешь его точку зрения... [Я не представляю это как ответ на твой вопрос напрямую, я просто уточняю точку зрения Винни, чтобы прояснить любую возможную путаницу относительно этого.]

Рассмотрим этот объект:

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

И у меня есть целая группа людей в моем списке.

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 может быть отсортирован подобным образом, либо для примитивного типа, либо для сложного объекта.

Другие вопросы по тегам