【发布时间】:2013-10-22 18:12:36
【问题描述】:
由于我无法从 Linq to Entities 查询中返回这两种类型中的任何一种,所以我坚持返回一个列表。
从 DB 调用(位于单独的 WCF 服务或 DLL 中)返回时,控制器中的代码将失败,因为 dbcontext 连接已关闭。
注意下面的代码。对于 IEnumerable 和 IQueryable,由于上面的描述,数据没有返回。
MVC 控制器中的方法
// Controller
IEnumerable<ProjectDescription> projectDdl = db.GetProjectDropDownList().AsEnumerable();
// Error coming back because dbcontext connection was closed.
ViewBag.ProjectsCust = new SelectList(projectDdl, "ProjectId", "Name");
WCF 服务或 DLL 中的方法
// WCF Service or DLL
public IEnumerable<ProjectDescription> GetProjectDropDownList()
{
try
{
//IQueryable<ProjectDescription> project = null;
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
IEnumerable<ProjectDescription> project = DbContext.Projects.Select(s =>
new ProjectDescription()
{
ProjectID = s.ProjectID,
Description = s.Description
}
);
return project;
}
}
catch (Exception ex)
{
throw ex;
}
}
我什至尝试在 DB 调用之前建立一个 DbContext 实例,但实际上尝试将 DbContext 传递给 DB 方法仍然不起作用。
控制器:
DbContext = new YeagerTechEntities();
IEnumerable<ProjectDescription> projectDdl = db.GetProjectDropDownList(DbContext).AsEnumerable();
ViewBag.ProjectsCust = new SelectList(projectDdl, "ProjectId", "Name");
DbContext.Dispose();
数据库方法:
public IEnumerable<ProjectDescription> GetProjectDropDownList(YeagerTechEntities DbContext)
{
try
{
//IQueryable<ProjectDescription> project = null;
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
IEnumerable<ProjectDescription> project = DbContext.Projects.Select(s =>
new ProjectDescription()
{
ProjectID = s.ProjectID,
Description = s.Description
}
);
return project;
}
catch (Exception ex)
{
throw ex;
}
}
除了使用 List 之外,唯一有效的方法是将 DB 方法实际放置在 Controller 中,这显然不是一个好的做法。
这是正常工作的列表约定:
控制器:
IEnumerable<ProjectDescription> projectDdl = db.GetProjectDropDownList();
ViewBag.ProjectsCust = new SelectList(projectDdl, "ProjectId", "Name");
数据库方法:
public List<ProjectDescription> GetProjectDropDownList()
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
IEnumerable<ProjectDescription> project = DbContext.Projects.Select(s =>
new ProjectDescription()
{
ProjectID = s.ProjectID,
Description = s.Description
}
);
List<ProjectDescription> myProjects = new List<ProjectDescription>();
myProjects = project.ToList();
return myProjects;
}
}
catch (Exception ex)
{
throw ex;
}
}
如果有人可以向我解释在使用 IQueryable 或 IEnumerable 时正确的模型应该是什么,那很好。但是,在阅读了这个链接之后,看起来 List 绝对是要走的路: IEnumerable vs IQueryable for Business Logic or DAL return Types
【问题讨论】:
标签: c# asp.net-mvc linq wcf entity-framework