C# EF查询不会强制转换

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

我正在使用EF4.x填充ASP.NET下拉列表。我首先创建一个变量:

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页面使用。