MSDN文档声明EntitySet实现了IBindingList
(参见http://msdn.microsoft.com/en-us/library/bb546190.aspx处的'绑定到EntitySets')
但是,可以清楚地看到EntitySet没有实现此接口!
那我该如何排序?
对于上下文,我将此集绑定到WPF ListView。
有关问题的更广泛背景,我正在尝试解决,请参阅this post。
答案 0 :(得分:7)
的EntitySet< T>没有实现IBindingList ...它提供了一个获取IBindingList的方法。您需要调用.GetNewBindingList()来获取EntitySetBindingList< T>的实例,该实例派生自SortableBindingList< T>,它是BindingList< T>。 EntitySetBindingList只是原始EntitySet< T>的包装器。它是从中创建的,因此对它的任何修改都是对原始EntitySet的修改。
编辑:使用BindingList排序:
要使用BindingList进行排序,您需要公开某种接口以允许排序。 BindingList< T>内支持排序。 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)
考虑这个对象:
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进行排序。