如何对EntitySet <t> </t>进行排序

时间:2009-05-29 11:30:33

标签: .net linq-to-sql data-binding sorting entityset

MSDN文档声明EntitySet实现了IBindingList

(参见http://msdn.microsoft.com/en-us/library/bb546190.aspx处的'绑定到EntitySets')

但是,可以清楚地看到EntitySet没有实现此接口!

那我该如何排序?

对于上下文,我将此集绑定到WPF ListView。

有关问题的更广泛背景,我正在尝试解决,请参阅this post

4 个答案:

答案 0 :(得分:7)

的EntitySet&LT; T&GT;没有实现IBindingList ...它提供了一个获取IBindingList的方法。您需要调用.GetNewBindingList()来获取EntitySetBindingList&lt; T&gt;的实例,该实例派生自SortableBindingList&lt; T&gt;,它是BindingList&lt; T&gt;。 EntitySetBindingList只是原始EntitySet&lt; T&gt;的包装器。它是从中创建的,因此对它的任何修改都是对原始EntitySet的修改。

编辑:使用BindingList排序:

要使用BindingList进行排序,您需要公开某种接口以允许排序。 BindingList&lt; T&gt;内支持排序。 class,但它通过受保护的属性和方法。应该可以使用包装器公开表达式排序方法:

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&lt; T&gt;上对任何通常公开的方法进行防范。提供给构造函数的那个​​。

答案 1 :(得分:1)

OrderByDecending!

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

答案 2 :(得分:0)

你能做.ToList()。OrderBy(x =&gt; x.FieldToSortBy)?

答案 3 :(得分:0)

<=> Hainesy - 根据你对Vinny的帖子的评论来判断,我认为你错过了他的观点... [我不是直接回答你的问题,我只是详细阐述了Vinny的观点。任何可能的混淆。]

考虑这个对象:

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

现在,假设我有一个名为People

的人员设置列表
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进行排序。