0

我正在使用 EF 4.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 未被用户代码处理
Message=Unable to cast object of type 'System.Data.Objects.ObjectQuery`1[CPAS_EM.qryxrefVendorWorker]' 类型为 'CPAS_EM.qryxrefVendorWorker'

谁能在这里指出我正确的方向?

4

3 回答 3

4

你的代码

(from w in sds.qryxrefVendorWorkers 
where w.VendorID == currVendorID && ((w.ExpiryDate == null) | (w.ExpiryDate >= currWorkDate)) 
select w)

实际上是一个查询,而不是单个对象。您可能想添加FirstOrDefault()以获取单个元素。然后也不需要演员表。

于 2013-02-06T20:23:35.713 回答
0

为什么需要在使用范围之外声明的变量?你不能这样做:

   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() 来获取单个对象而不是集合。

于 2013-02-06T20:27:02.700 回答
0

你可以试试这个:

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

于 2013-02-07T03:27:33.903 回答