【问题标题】:Setting the order of LINQ to SQL ObservableCollection将 LINQ 的顺序设置为 SQL ObservableCollection
【发布时间】:2015-02-13 00:05:05
【问题描述】:

我在 DataGrid 顶部有一个 ComboBox,它绑定到从 LINQ 到 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);
        }

    }
}

【问题讨论】:

    标签: c# wpf linq combobox


    【解决方案1】:

    在您的 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);
    }
    

    编辑:

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

    【讨论】:

    • 因此,我可以代替我现在使用的 foreach 循环(参见上面的编辑),进一步扩展我的可视集合(它公开了一个可过滤的列表方法)以包含这个扩展方法。 . .我不确定,但会尝试。
    • 啊,是的。 . .感谢您的洞察力。 . .只是在我的 for each 循环前面添加了 var linq 行,然后在 foreach 循环中使用 linq 而不是之前的 linq 表。非常好。
    • 由于我只是将其用作过滤工具,因此不必强制绑定回数据库。但我认为,如果要更改(即更新/删除/插入),这可能会破坏与数据库的绑定。 . .那是对的吗?我的 observable 集合中的项目是否没有对模型的引用?
    • 删除/插入是什么意思?就像你从集合中删除一个对象一样,它会被删除/插入吗?
    • 更新将起作用,因为 ObservableCollecitons 包含您的实体,但不会自动将记录插入数据库或从中删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多