我的应用是使用DbContext的EF 5.0 Code First。我一直试图使用Linq来操纵(过滤和排序)。我首先尝试将上下文加载到Local,如:
context.mytable.orderby(function a a.somestring).thenby(function b d.someint).load
我没有收到任何错误,但忽略了字符串排序。 int排序有效。类似地,当我尝试设置我的绑定源时,比较字符串或日期的linq部分不起作用,但是当我使用整数时,它可以工作。我假设这些没有正确转换为SQL查询,但我无法弄清楚如何解决它们。我希望有一个正确的方向。
答案 0 :(得分:0)
然而,Load()不会创建任何内容,它只需要一堆项目并将它们从底层源加载到您的上下文中。您不能对context.mytable强加排序,因为mytable不包含实际数据,它包含您将用于获取实际数据的部分查询。
要获得对UI的排序,您需要订购要绑定的列表,或者使用无序列表并将其包装在作业要应用排序的对象中。由于您使用的是Local,请使用后者并使用CollectionViewSource。
这是WPF中CollectionViewSource的一个示例。它绑定到DataContext的属性StateOrProvinces,它是我想按顺序显示的无序列表:
<UserControl.Resources>
<CollectionViewSource x:Key="stateOrProvinceViewSource" Source="{Binding Path=StateOrProvinces}" >
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
</CollectionViewSource>
</UserControl.Resources>
scm是:
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
代码中的相同内容:
CollectionViewSource orderedView = new CollectionViewSource()
{
Source = StateOrProvinces,
};
orderedView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
使用额外的图层来应用排序有一些优点。它允许您在不同的位置显示具有不同排序的相同列表,并且您可以添加/删除基础列表中的项目,而无需每次都手动应用排序。
你还应该看看CollectionView课程中有一些额外的花里胡哨,但我不会进入它,以减少信息过载。