我正在尝试一些查询,以找出获得性能提升的最佳方法。
我知道使用 IQueryable 比执行 Linq to Sql 或 Linq to Entity 数据库查询更可取,并且 IEnumerable 最适合用于 linq to Objects、Linq to xml 和内存处理。
我的 WCF 服务有如下 linq 查询。当我尝试修改调用它的 Controller 方法时,我收到以下设计时编译错误:
无法将类型“YeagerTechModel.DropDownLists.ProjectDescription[]”隐式转换为“System.Linq.IQueryable”
请注意,ProjectDescription 对象定义如下:
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
namespace YeagerTechModel.DropDownLists
{
[DataContract]
[Serializable]
public partial class ProjectDescription
{
[DataMember]
public Int16 ProjectID { get; set; }
[DataMember]
public String Description { get; set; }
}
}
这是数据库方法调用:
public IQueryable<ProjectDescription> GetProjectDropDownList()
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
IQueryable<ProjectDescription> project = DbContext.Projects.Where(w => w.Notes != null).Select(s =>
new ProjectDescription()
{
ProjectID = s.ProjectID,
Description = s.Description
}
);
return project;
}
}
catch (Exception ex)
{
throw ex;
}
}
这是Controller方法中的代码:
IQueryable<ProjectDescription> projectDdl = db.GetProjectDropDownList();
现在,在阅读了 IQueryable 等的性能增益之后,在进行此实验之前,从数据库中获取数据的原始方法如下:
public List<ProjectDescription> GetProjectDropDownList()
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
var project = DbContext.Projects.Where(w => w.Notes != null).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;
}
}
Controller中的代码如下:
IEnumerable<ProjectDescription> projectDdl = db.GetProjectDropDownList();
第一个问题是:许多查询使用 var 关键字来推断返回的类型。调用数据库检索记录时使用哪一个?“var”语法还是“IQerable”语法?
我注意到的第二件事是,在控制器端,对于一个集合,它总是需要一个可以轻松转换为 IEnumerable 的 List 对象。
因此,基于这个前提,我认为我的最佳解决方案如下: 对于 DB 方法调用:
public List<ProjectDescription> GetProjectDropDownList()
{
try
{
using (YeagerTechEntities DbContext = new YeagerTechEntities())
{
DbContext.Configuration.ProxyCreationEnabled = false;
DbContext.Database.Connection.Open();
IQueryable<ProjectDescription> project = DbContext.Projects.Where(w => w.Notes != null).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;
}
}
对于Controller中的代码片段,它应该如下并且一切正常:
IEnumerable<ProjectDescription> projectDdl = db.GetProjectDropDownList();
那么,如果 IQueryable 提供了更好的性能(特别是在过滤和支持延迟加载方面),为什么不使用最后一个 DB 方法而不是“var”关键字呢?
有人可以帮助解释什么应该是最佳方案吗?