将LINQ的顺序设置为SQL ObservableCollection

时间:2015-02-13 00:05:05

标签: c# wpf linq combobox

我在DataGrid顶部有一个ComboBox,它绑定到LINQ to SQL映射的可观察集合。那就是我使用“拖放”方法将表格放入我的DataClasses,然后填充一个ObservableCollection。我想让组合框以最新的第一顺序(在名称字段中降序)呈现项目,但找不到任何要设置的属性。看起来像对可观察集合进行排序是错误的方法。我认为最简单的方法是使用存储过程而不是表作为LINQ to SQL类生成器。我错过了一些更简单的内置解决方案吗?

以下是将LINQ生成表添加到我的observable集合的类代码:

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

    }
}

1 个答案:

答案 0 :(得分:1)

在你的LINQ to Sql中

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

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

E.g。

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

修改

如果要自动添加到上下文或删除,则需要侦听基类的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);
    }
}