C# EF查询不会强制转换
我正在使用EF4.x填充ASP.NET下拉列表。我首先创建一个变量:C# EF查询不会强制转换,c#,entity-framework,lambda,C#,Entity Framework,Lambda,我正在使用EF4.x填充ASP.NET下拉列表。我首先创建一个变量: CPAS_EM.qryxrefVendorWorker wrkrs; 然后,我去填充它: using (CPASEntities sds = new CPASEntities()) { wrkrs = (qryxrefVendorWorker) (from w in sds.qryxrefVendorWorkers
CPAS_EM.qryxrefVendorWorker wrkrs;
然后,我去填充它:
using (CPASEntities sds = new CPASEntities())
{
wrkrs = (qryxrefVendorWorker)
(from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID &&
((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w);
ddlWorker.DataSource = wrkrs;
ddlWorker.DataValueField = wrkrs.WorkerID.ToString();
ddlWorker.DataTextField = wrkrs.WorkerName;
ddlWorker.DataBind();
}
我在wrkrs=上得到一个错误。。。指示强制转换错误的语句:
用户代码未处理System.InvalidCastException
消息=无法强制转换类型为的对象
'System.Data.Objects.ObjectQuery'1[CPAS_EM.qryxrefVendorWorker]'到
键入“CPA_EM.qryxrefVendorWorker”
有人能给我指出正确的方向吗?你的代码
(from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID && ((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w)
实际上是一个查询,而不是单个对象。您可能希望添加FirstOrDefault以仅获取单个元素。那么也不需要强制转换。您的代码
(from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID && ((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w)
实际上是一个查询,而不是单个对象。您可能希望添加FirstOrDefault以仅获取单个元素。那么也不需要强制转换。为什么需要在使用范围之外声明变量?你不能:
using (CPASEntities sds = new CPASEntities())
{
var wrkrs = (from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID
&& ((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w).FirstOrDefault();
ddlWorker.DataSource = wrkrs;
ddlWorker.DataValueField = wrkrs.WorkerID.ToString();
ddlWorker.DataTextField = wrkrs.WorkerName;
ddlWorker.DataBind();
}
并完全取消该声明
另外,正如user1908061所说,您还需要FirstOrDefault来只获取单个对象而不是集合。为什么需要在使用范围之外声明变量?你不能:
using (CPASEntities sds = new CPASEntities())
{
var wrkrs = (from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID
&& ((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w).FirstOrDefault();
ddlWorker.DataSource = wrkrs;
ddlWorker.DataValueField = wrkrs.WorkerID.ToString();
ddlWorker.DataTextField = wrkrs.WorkerName;
ddlWorker.DataBind();
}
并完全取消该声明
此外,正如user1908061所说,您还需要FirstOrDefault只获取单个对象而不是集合。您可以尝试以下方法:
List<sds.qryxrefVendorWorkers > lstWorkers =
(from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID &&
((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w).ToList();
ddlWorker.DataSource = lstWorkers;
ddlWorker.DataValueField = "WorkerID";
ddlWorker.DataTextField = "WorkerName";
ddlWorker.DataBind();
这将返回一组qryxrefVendorWorkers。
转换失败,因为简单地说,在将查询转换为qryxrefVendorWorker时,您试图将一组对象转换为单个对象。您可以尝试以下操作:
List<sds.qryxrefVendorWorkers > lstWorkers =
(from w in sds.qryxrefVendorWorkers
where w.VendorID == currVendorID &&
((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate))
select w).ToList();
ddlWorker.DataSource = lstWorkers;
ddlWorker.DataValueField = "WorkerID";
ddlWorker.DataTextField = "WorkerName";
ddlWorker.DataBind();
这将返回一组qryxrefVendorWorkers。
转换失败,因为简单来说,在将查询转换为qryxrefVendorWorker时,您试图将一组对象转换为单个对象,这似乎是我的问题。我希望查询返回一组qryxrefVendorWorkers,而不是单个对象。似乎我需要某种类型的IQueryable对象?而且,在using块之外声明它的原因是为了使它作为下拉列表的数据源可供ASP.NET页面使用。这似乎是我的问题。我希望查询返回一组qryxrefVendorWorkers,而不是单个对象。似乎我需要某种类型的Iqueryiable对象?而且,在using块之外声明它的原因是为了使它作为下拉列表的数据源可供ASP.NET页面使用。