将 LINQ 的顺序设置为 SQL ObservableCollection

Setting the order of LINQ to SQL ObservableCollection

我在 DataGrid 的顶部有一个组合框,它绑定到从 LINQ 到 SQL 映射的可观察集合。那就是我使用 "drag and drop" 方法将 table 放入我的数据类中,然后填充一个 ObservableCollection。我想让组合框以最新的第一顺序显示项目(这将在名称字段上降序排列)但找不到要设置的任何 属性。似乎对可观察集合进行排序是错误的方法。我认为最简单的方法是使用存储过程而不是 table 作为 LINQ to SQL class 生成器。我是否缺少一些更简单的内置解决方案?

这里是 class 代码,用于将生成的 LINQ table 添加到我的可观察集合中:

class ObservableTransmittals : ViewableCollection<Transmittal>
{
    public ObservableTransmittals(DataClasses1DataContext dataDc) 
    {
        foreach (Transmittal trn in dataDc.Transmittals)
        {
            this.Add(trn);
        }

    }
}

现在从下面开始使用它:

class ObservableTransmittals : ViewableCollection<Transmittal>
{
    public ObservableTransmittals(DataClasses1DataContext dataDc) 
    {
        var linq = dataDc.Transmittals.OrderByDescending(x => x.TransName);
        foreach (Transmittal trn in linq)
        {
            this.Add(trn);
        }

    }
}

在你的 LINQ to Sql

var linq = YourTable.OrderByDescending(x => x.Name).ToObservableCollection();

其中 ToObservableCollection 是自定义扩展方法。

例如

public static ObservableCollection<T> ToObservableCollection<T>(this IEnumerable<T> list)
{
  return new ObservableCollection<T>(list);
}

编辑:

如果要自动添加到上下文或删除,则需要监听基础class的CollectionChanged事件。

class ObservableTransmittals : ObservableCollection<Transmittal>
{
    private readonly YourContext _dataContext;

    public ObservableTransmittals(YourContext dataContext)
    {

        var linq = dataContext.Transmittals.OrderByDescending(x => x.TransName);
        foreach (Transmittal trn in linq)
        {
            this.Add(trn);
        }

        _dataContext = dataContext;
    }

    protected override void RemoveItem(int index)
    {
        _dataContext.Transmittals.Remove(this[index]);
        base.RemoveItem(index);
    }

    protected override void InsertItem(int index, Transmittal item)
    {
        _dataContext.Transmittals.Add(item);
        base.InsertItem(index, item);
    }

    protected override void SetItem(int index, Transmittal item)
    {
        // Add replace logic
        base.SetItem(index, item);
    }
}