ASP.使用实体框架存储过程的.NET选择方法

本文关键字:NET 选择 方法 存储过程 框架 实体 ASP | 更新日期: 2023-09-27 18:13:04

我有这样的ListView

<asp:ListView ID="ListView1" ItemType="test.Project"  
     SelectMethod="ListView1_GetData" runat="server">

我正在尝试使用EF将选择方法设置为存储过程。像这样的选择方法

public IQueryable<Test.Project> ListView1_GetData()
{
    using (DREntities2 db=new DREntities2())
    {
        return db.GetLatestProjects().AsQueryable();
    }
}

我得到这个错误:

不能隐式转换类型"System.Linq"。到System.Linq.IQueryable。存在显式转换(您是否缺少强制类型转换?)

如果我删除.AsQueryable(),我得到这个错误:

不能隐式转换类型"System.Data.Objects"。ObjectResult' to 'System.Linq.IQueryable

下面是DREntities2 .GetLatestProjects()返回的GetLastestProjects_Result的定义:

public partial class GetLatestProjects_Result 
{ 
   public int ProjectID { get; set; } 
   public string Title { get; set; } 
   public string ShortDescr { get; set; } 
   public string Full_Descr { get; set; } 
   public int ProCatID { get; set; } 
   public bool Marquee { get; set; } 
}

ASP.使用实体框架存储过程的.NET选择方法

您的存储过程返回ObjectResult<Test.GetLatestProjects_Result>,您正试图将其转换为IQueryable<Test.Project>。要做到这一点,您需要使用Linq Select方法进行转换。假设Test.GetLatestProjects_ResultTest.Project具有相同的属性:

public IQueryable<Test.Project> ListView1_GetData()
{
    using (DREntities2 db=new DREntities2())
    {
        return db.GetLatestProjects().Select(p => new Test.Project
        {
            ProjectId = p.ProjectId,
            Title = p.Title,
            ShortDescr = p.ShortDescr,
            Full_Descr = p.Full_Descr,
            ProCatID = p.ProCatID,
            Marquee = p.Marquee
        }).AsQueryable();
    }
}

这有点晚了,但其他人可能能够做到以下几点。假设测试。项目是一个EntityType,在模型浏览器中将EF模型中存储过程的返回类型更改为Test。项目,而不是创建默认的GetLatestProjects_Result"复杂类型"。

然后,在你的查询中,你可以把结果放到一个类型化的列表中,然后对结果调用AsQueryable。

下面是一个调用名为GetAllRequestsByWorkflowState的SP的示例,该SP返回TravelRequestSummaryView实体:

private IQueryable<TravelRequestSummaryView> GetApprovalRequests(int approvalState)
{
    IQueryable<TravelRequestSummaryView> trsv = null;
    try
    {
        var res = db.GetAllRequestsByWorkflowState(approvalState)
            .ToList<TravelRequestSummaryView>();
        trsv = res.AsQueryable();
    }
    catch (Exception ex)
    {
        sqlTraceManager.WriteTraceIf(ex, User.Identity.Name);
    }
    return trsv;
}