【问题标题】:LINQ query into ObservableCollection?LINQ 查询到 ObservableCollection?
【发布时间】:2016-11-11 16:20:24
【问题描述】:

Cast LINQ result to ObservableCollection

Jon Skeet 在这个问题中给出了很好的答案,但我仍然无法自己制作。

classes 还是新手,所以我仍处于与他们一起学习的阶段。

我已经制作了一个 LINQ to SQL 类,显然有很多自动生成的代码。这是添加类时生成的类的sn-p,与此问题相关。这显然与名为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 查询?

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

不能隐式转换类型 '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();

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    基本上,您需要将实际查询的IEnumerable&lt;Staff_Time_TBL&gt;结果传递给数据库以初始化ObservableCollection&lt;Staff_Time_TBL&gt;

    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:据我所知,根据您在此处的评论,此答案已解决您的问题,应该被接受。如果您有新问题,请发布新问题,不要添加新问题。
    • @PeterDuniho,问题进行到一半,我问这个How can I make an Observablecollection Class to hold the LINQ query? 这是我的目标和问题的目的。
    • @KyloRen:以上回答了这个问题。它显示了一个 LINQ 查询——事实上,它准确地显示了您在问题中提供的 LINQ 查询——并显示了如何创建一个 ObservableCollection&lt;T&gt; 的实例来保存该 LINQ 查询的结果。即使按照您自己的说法,这也是您问题的答案。你不明白哪一部分?
    • @PeterDuniho,原谅我的无知,我还在学习课程。我感谢 har07 的努力并相应地投了赞成票,但我仍然无法从他/她自己发布到课程中的内容中得到什么?
    【解决方案2】:

    您需要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 接口通知更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 2013-09-20
      相关资源
      最近更新 更多