Как вы сортируете EntitySet <T> - PullRequest
1 голос
/ 29 мая 2009

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

(см. «Связывание с EntitySets» в http://msdn.microsoft.com/en-us/library/bb546190.aspx)

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 29 мая 2009

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

1 голос
/ 11 ноября 2011

OrderByDecending!

var tags = objContext.Tags;
gvTester.DataSource = tags.OrderByDescending(x => x.TagID); ;
gvTester.DataBind();
0 голосов
/ 29 мая 2009

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

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

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

0 голосов
/ 29 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...