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; }
}
您的存储过程返回ObjectResult<Test.GetLatestProjects_Result>
,您正试图将其转换为IQueryable<Test.Project>
。要做到这一点,您需要使用Linq Select
方法进行转换。假设Test.GetLatestProjects_Result
和Test.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;
}