LINQ查询到ObservableCollection?

时间:2016-07-09 02:53:28

标签: c# linq

Cast LINQ result to ObservableCollection

Jon Skeet在这个问题上给出了一个很好的答案,但我仍然不能自己做。

classes还是新手,所以我还处于学习阶段。

我已经创建了一个LINQ to 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, 它从两个日期之间以及具有唯一员工编号的工作人员中提取数据。这很好,但是当数据直接更新到数据库时,界面中的数据不会更新,see this question.

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

This code in this answer是可以理解的,但我不知道foo需要什么?

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

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

如何创建一个Observablecollection类来保存LINQ查询?

这是我尝试做的事情,但在查询时给了我一个编译错误。

  

无法隐式转换类型   &#39; System.Collections.Generic.List&#39;至   &#39; System.Collections.ObjectModel.ObservableCollection&#39;

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 个答案:

答案 0 :(得分:5)

基本上,您需要将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);

答案 1 :(得分: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界面通知更改。