0

我的应用是使用 DbContext 的 EF 5.0 Code First。我一直在尝试使用 Linq 操作(过滤和排序)。我首先尝试将上下文加载到本地,例如:

context.mytable.orderby(function a a.somestring).thenby(function b d.someint).load

我没有收到任何错误,但字符串排序被忽略了。int 排序有效。同样,当我尝试设置绑定源时,比较字符串或日期的 linq 部分不起作用,但是当我使用整数时它起作用。我假设这些没有正确转换为 SQL 查询,但我不知道如何修复它们。我会欣赏正确方向的观点。

4

1 回答 1

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类,但我不会进入它,以减少信息过载。

于 2013-02-28T20:49:02.510 回答