我是WPF的新手,我正在努力。我需要使用数据库中的数据填充组合框。我正在尝试使用LINQ将数据检索到我通过XAML绑定的ObservableCollection中。除了我以外,每个人都很简单。我收到错误“实体或复杂类型”无法在LINQ to Entities查询中构建。当我尝试填充集合时。我究竟做错了什么?我看过几个不同的问题,比如this one和this 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; }
}
}
答案 0 :(得分:1)
您似乎正在获取实体Customer
的集合,并尝试将其投放到Customer
。也许它变得困惑。
Linq使用延迟执行,并尝试将查询传递给数据库。触发执行的是ToList()
方法。如果2个客户类(可观察集合中的查询和类型)实际上是同一个实体,则只需使用结果填充集合。
请注意,除非您从集合中动态添加/删除项目,否则可能没有理由使用ObservableCollection
。 List<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);
}
}