LINQ查询转换为ObservableCollection?

6

将LINQ结果转换为ObservableCollection

Jon Skeet在这个问题中给出了很好的答案,但是我仍然不能自己完成。

我还是新手使用,所以我还在学习阶段。

我已经创建了一个LINQ到SQL类,显然有很多自动生成的代码。这是添加类时生成的与此问题相关的类的片段。这显然与名为Staff_Time_TBL的数据库表相关联。

public partial class Staff_Time_TBL : INotifyPropertyChanging, INotifyPropertyChanged
    {

        private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);

        private long _ID;

        private System.Nullable<System.DateTime> _Date_Data;
    }

我有一个工作类,可以将我需要的数据放入Datagrid中,它可以从两个日期之间和拥有唯一员工编号的员工那里获取数据。这个方法很好用。但是当直接更新数据库中的数据时,界面中的数据没有被更新。请查看这个问题。

internal class DatabaseQueries
    {
        public static IEnumerable<Staff_Time_TBL> MainTable(DatabaseDataContext database, DateTime fromDate, DateTime toDate, int employeeNumber)
        {
            return database.Staff_Time_TBLs.Where(staff =>
                staff.Date_Data > fromDate &&
                staff.Date_Data < toDate &&
                staff.Staff_No == employeeNumber);
        }

这个答案中的代码很容易理解,但我不知道foo需要是什么?

var linqResults = foos.Where(f => f.Name == "Widget");

var observable = new ObservableCollection<Foo>(linqResults);

如何创建一个ObservableCollection类来保存LINQ查询结果?

我尝试了以下代码,但查询语句会导致编译错误:

无法隐式地将类型'System.Collections.Generic.List'转换为'System.Collections.ObjectModel.ObservableCollection'

public ObservableCollection<Staff_Time_TBL> observerableInfoData { get; set; }

        public MainWindow()
        {  
            DataContext = this; // required for C# binding
            InitializeComponent();            

                            observerableInfoData = new ObservableCollection<Staff_Time_TBL>();
                observerableInfoData = sql.Staff_Time_TBLs.Where(staff => staff.Staff_No == SelectedEmployee.Key &&
                                               staff.Date_Data == filterFrom &&
                                               staff.Date_Data == filterTo).Select(staff => staff.Info_Data).ToList();
2个回答

12
基本上,您需要传递实际查询的 IEnumerable<Staff_Time_TBL> 结果来初始化 ObservableCollection<Staff_Time_TBL>
var linqResults = sql.Staff_Time_TBLs
                     .Where(staff => staff.Staff_No == SelectedEmployee.Key &&
                                     staff.Date_Data == filterFrom &&
                                     staff.Date_Data == filterTo);

var observable = new ObservableCollection<Staff_Time_TBL>(linqResults);

啊,我现在明白了。谢谢你的帮助。不过我有一个问题,怎么把这个变成一个类?我已经为你提供的帮助点赞了。 - KyloRen
@KyloRen:根据您在此处的评论,就我所知,此答案已回答了您的问题,应该被接受。如果您有新的问题,请发布一个新的问题,而不是在此问题上添加新的问题。 - Peter Duniho
@PeterDuniho,我在问题的一半时问了这个问题:“如何创建一个ObservableCollection类来保存LINQ查询?”这是我的目标和问题的目的。 - KyloRen
@KyloRen: 上面的回答就是解答了那个问题。它展示了一个 LINQ 查询 - 实际上,它展示了你在问题中提供的确切的 LINQ 查询 - 并展示了如何创建一个 ObservableCollection<T> 实例来保存该 LINQ 查询的结果。即使按照你自己的说法,这也是你问题的 答案 。你不理解哪一部分呢? - Peter Duniho
@PeterDuniho,不好意思,我不知道。我会发另一个问题并标记此问题已解决。 - KyloRen
显示剩余3条评论

0
你需要使用ObservableComputations库。使用这个库,你可以像这样编写代码:
var linqResults = sql.Staff_Time_TBLs
                     .Filtering(staff =>
                        staff.Date_Data > fromDate &&
                        staff.Date_Data < toDate &&
                        staff.Staff_No == employeeNumber);

在上面的代码中,我假设sql.Staff_Time_TBLs是ObservableCollection。linqResults是ObservableCollection,反映了sql.Staff_Time_TBLs集合中的所有更改和代码中提到的属性。请确保代码中提到的所有属性都通过INotifyPropertyChanged接口通知更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接