【问题标题】:Make ObservableCollection class with LINQ [duplicate]使用 LINQ 创建 ObservableCollection 类
【发布时间】:2016-07-09 07:05:59
【问题描述】:

我正在尝试使用 LINQ 查询创建一个 单独的 类,以用于绑定到 WPF 表单。我有以下代码,这些代码是我从本网站和其他网站的研究中整理出来的,但得到一个编译错误说明。

不能隐式转换类型 'System.Linq.IQueryable' 到 system.Collections.ObjectModel.ObservableCollection'。 存在显式转换(您是否缺少演员表?)

Staff_Time_TBL 是在生成 LINQ to SQL 时自动生成的类。 Staff_Time_TBL 是我试图从中获取数据的 SQL Server 中 Table 的名称。

class ObservableData
    {
        public ObservableCollection<Staff_Time_TBL> InfoData { get; set; }

        public ObservableData(DatabaseDataContext database, int staffNo, DateTime fromDate, DateTime toDate)
        {
            InfoData = new ObservableCollection<Staff_Time_TBL>();
            InfoData = database.Staff_Time_TBLs
                              .Where(staff => staff.Staff_No == staffNo &&
                                     staff.Date_Data == fromDate &&
                                     staff.Date_Data == toDate);
        }            
    }

我尝试使用Tolist(),但得到这个编译错误,

不能隐式转换类型 'System.Collections.Generic.List' 到 'System.Collections.ObjectModel.ObservableCollection'

我希望我清楚自己要做什么,以及对我做错什么有任何帮助?

编辑:这与实现集合有关。

【问题讨论】:

  • 这个问题一点都不清楚。它看起来与你的另一个几乎没有什么不同,LINQ query into ObservableCollection?。你说的“分班”是什么意思? ObservableCollection&lt;T&gt; 以什么方式没有做你想做的事?您的其他问题中的答案以何种方式完全解决了您在此处询问的 compiler 错误,但没有完成您想要的。
  • 为什么你继续尝试将不是 ObservableCollection&lt;T&gt; 的东西分配给变量,即使你已经回答了另一个问题,告诉你如何正确获取 ObservableCollection&lt;T&gt; 对象包含查询中的元素吗?
  • @PeterDuniho,如果我知道我肯定不会发布这个问题。我不知道有什么其他的说法,这是我想要做的类中的方法吗?
  • @PeterDuniho,José Caballero 的回答解决了我遇到的问题。
  • “José Caballero 的回答解决了我遇到的问题” -- 我不知道怎么做。他的答案在功能上与您对其他问题的答案没有什么不同。最终的结果是完全一样的。你可以很容易地写observableSomeClass = new ObservableCollection&lt;SomeClass&gt;(result);observableSomeClass 对象在每个版本的代码中的最终状态将彼此无法区分。

标签: c# wpf linq


【解决方案1】:

请试试这个代码:

InfoData = new ObservableCollection<Staff_Time_TBL>
                 (
                   database.Staff_Time_TBLs
                   .Where(staff => staff.Staff_No == staffNo &&
                          staff.Date_Data == fromDate &&
                          staff.Date_Data == toDate).ToList()
                 );

请参考thisMSDN链接

【讨论】:

  • 谢谢,这也很有帮助,感谢您抽出宝贵的时间。对帮助投了赞成票。
【解决方案2】:

这对我有用:

//Since i dont know what Staff_Time_TBL has or represents, i will use this as example
public class SomeClass
{
    public int number;
    public string text;
    public bool flag;
}

class Program
{
    static void Main(string[] args)
    {
        //Your observable collection
        ObservableCollection<SomeClass> observableSomeClass = new ObservableCollection<SomeClass>();

        //I am assuming that in your LINQ query you are using a list or a structure, this is not important at all
        List<SomeClass> listSomeClass = new List<SomeClass>();

        //Im just adding some data to my list to work with
        listSomeClass.Add(new SomeClass
        {
            number = 1,
            text = "ONE",
            flag =  true
        });
        listSomeClass.Add(new SomeClass
        {
            number = 2,
            text = "TWO",
            flag = false
        });
        listSomeClass.Add(new SomeClass
        {
            number = 3,
            text = "THREE",
            flag = true
        });

        //This is a example LINQ query which is going to return me the ones that flag is equals to true (2)
        var result = from node in listSomeClass
                     where node.flag == true
                     select new
                     {
                         node.number,
                         node.text,
                         node.flag
                     };

        //THIS IS THE TRICK:
        //Instead of trying making a convertion or a toList(), try iterating your result from your linq query and adding it to your observable structure
        foreach (var r in result)
        {
            observableSomeClass.Add(new SomeClass
            {
                number = r.number,
                text = r.text,
                flag = r.flag
            }
            );

        }

        Console.ReadLine();
    }

}

希望对你有帮助。

【讨论】:

  • 非常感谢,这解决了我遇到的很多问题。我现在终于明白为什么我的另一个问题是相关的了。
猜你喜欢
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多