WPF,LINQ和ObservableCollections

时间:2015-04-03 16:20:51

标签: c# wpf linq

我是WPF的新手,我正在努力。我需要使用数据库中的数据填充组合框。我正在尝试使用LINQ将数据检索到我通过XAML绑定的ObservableCollection中。除了我以外,每个人都很简单。我收到错误“实体或复杂类型”无法在LINQ to Entities查询中构建。当我尝试填充集合时。我究竟做错了什么?我看过几个不同的问题,比如this onethis one,但没有运气。这看起来很简单。我做错了什么?

以下是我的ViewModel的样子:

public class MainViewModel : ObservableObject
{
    private ObservableCollection<Customer> _customers;
    public ObservableCollection<Customer> Customers
    {
        get { return _customers; }
        set
        {
            if ( value != _customers )
            {
                _customers = value;
                OnPropertyChanged( "Customers" );
            }
        }
    }

    public MainViewModel()
    {
        // populate the customers combo
        using ( var db = new DataContext() )
        {
            var customer = ( from c in db.Customers
                           where c.Active == true
                           select new Customer
                           {
                               CustomerID = c.CustomerID,
                               Name = c.Name
                           } );
            // Error Here
            Customers = new ObservableCollection<Customer>( customer.ToList() );
            // Tried this too
            //var Query = db.Customers.Select( c => new Customer() { Name=c.Name, CustomerID=c.CustomerID } ).ToList<Customer>();
            //Customers = new ObservableCollection<Customer>(Query);
        }
    } 
}

编辑: 以下是Customer类的副本:

namespace EF_HVAC_Estimator.Models
{
    [Table( "Customers" )]
    public class Customer : ModelBase
    {
        [Key]
        public int CustomerID { get; set; }

        public int EmployeeID { get; set; }

        [StringLength( 100 )]
        public string Name { get; set; }

        [StringLength( 100 )]
        public string Address { get; set; }

        [StringLength( 100 )]
        public string City { get; set; }

        public int StateID { get; set; }

        [StringLength( 10 )]
        public string Zip { get; set; }

        [StringLength( 15 )]
        public string Phone { get; set; }

        [StringLength( 15 )]
        public string Fax { get; set; }

        [StringLength( 50 )]
        public string EmailAddress { get; set; }

        public bool Active { get; set; }

        public List<Estimate> Estimates { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

您似乎正在获取实体Customer的集合,并尝试将其投放到Customer。也许它变得困惑。

Linq使用延迟执行,并尝试将查询传递给数据库。触发执行的是ToList()方法。如果2个客户类(可观察集合中的查询和类型)实际上是同一个实体,则只需使用结果填充集合。

请注意,除非您从集合中动态添加/删除项目,否则可能没有理由使用ObservableCollectionList<Customer>就足够了。 Customer类是相同的,还是ObservableCollection不同的Customer类?如果是这种情况,指定命名空间可能会有所帮助。

using(var db = new DataContext())
{
  Customers = db.Customers
                .Where(c => c.Active == true).ToList();
}

[编辑] 好吧那么......简单地遍历列表以填充...应该是相同的结果。我认为问题在于你在Linq选择期间所做的演员。

using(var db = new DataContext())
{
    var custs = db.Customers
                  .Where(c => c.Active == true).ToList();

    if(Customers == null)
        Customers = new ObservableCollection<Customer>();
    foreach (var cust in custs)
    {
        Customers.Add(cust);
    }
}