我们如何在MVC 3中使用EDM?
LINQ to Entity是一个用于查询和管理数据库的出色ORM。它提供了很多东西,因此必须了解它的性能。这些都是正确的,因为LINQ有自己的惩罚。
在使用实体框架ORM设计和查询数据库时,是否应该记住哪些提示?
答案 0 :(得分:0)
您可以参考this to Create and Know more about EDM,Creating Model first EDM。
以下方式可以提高EDM效果......
以下是一些提示。
<强> 1。避免将所有数据库对象放入一个单一实体模型
实体模型指定单个工作单元,而不是我们所有的数据库。如果我们有许多未相互连接的数据库对象,或者根本没有使用这些(日志表,批处理使用的对象等)。因此,这些对象消耗存储器中的空间并导致性能降低。因此,尝试制作相关数据库对象的单独实体模型。
<强> 2。如果不需要,请禁用实体的更改跟踪
每当您检索数据仅用于读取目的而不是修改时,则不需要对象跟踪。因此,使用MergeOption禁用对象跟踪,如下所示:
NorthwindDataContext context = new NorthwindDataContext();
context.tblCities.MergeOption = MergeOption.NoTracking;
此选项允许我们关闭对象缓存和对象的不必要的身份管理。
第3。使用预生成视图减少第一次请求的响应时间
当在应用程序中第一次创建ObjectContext的对象时,实体框架会创建一组访问数据库所需的类。这组类称为视图,如果您的数据模型很大,则创建视图可能会将Web应用程序响应延迟到第一个页面请求。我们可以通过使用T4模板或EdmGen.exe命令行工具在编译时创建视图来缩短响应时间。
<强> 4。如果不需要,请避免提取所有字段 避免从数据库中提取不必要的字段。假设我有20个字段的Customer表,我只对三个字段感兴趣 - CustomerID,Name,Address然后只获取这三个字段而不是获取Customer表的所有字段。
//Bad Practice
var customer =
(from cust in dataContext.Customers
select cust).ToList();
//Good Practice
var customer =
(from cust in dataContext.Customers
select new {
customer. CustomerID,
customer.Name,
customer.Address
}). ToList ();
<强> 5。选择适当的数据操作集合
在linq中,我们有用于数据操作的Var,IEnumerable,IQueryable,IList类型集合。每个集合都有其对查询的重要性和性能影响,因此请注意使用所有这些集合进行数据操作。要了解所有这些集合之间的差异,请参阅文章IEnumerable VS IQueryable,IEnumerable VS IList和Var VS IEnumerable。
<强> 6。在任何需要的地方使用编译查询
如果经常用于从数据库中获取记录,则对已编译的查询进行查询。此查询在第一次运行缓慢但在此之后它显着提高了性能。我们使用CompiledQuery类的Compile方法进行编译查询。
假设您需要根据城市一次又一次地检索客户详细信息,然后将此查询作为编译查询,如
// create the entity object
NorthwindEntities mobjentity = new NorthwindEntities();
//Simple Query
IQueryable lstCus = from customer in mobjentity.tblCustomers
where customer.City == "Delhi"
select customer;
//Compiled Query
Func> compiledQuery
= CompiledQuery.Compile>(
(ctx, city) =>from customer in ctx.Customers
where customer.City == city
select customer);
在上面的查询中,我们传递字符串参数city来过滤记录。有关匿名方法的更多信息。
<强> 7。仅检索所需的记录数
当我们将数据绑定到网格或进行分页时,只检索所需的no记录以提高性能。这可以通过使用Take,While和Skip方法来实现。
// create the entity object
NorthwindEntities mobjentity = new NorthwindEntities();
int pageSize=10,startingPageIndex=2;
List lstCus = mobjentity.tblCustomers.Take(pageSize)
.Skip(startingPageIndex * pageSize)
.ToList();
<强> 8。避免使用包含
在LINQ中,我们使用contains方法来检查存在。它在SQL中转换为“WHERE IN”,导致性能下降。
<强> 9。避免使用视图
视图降低了LINQ查询性能的代价。这些性能很慢并且会大大影响性能。因此,请避免在LINQ to Entities中使用视图。
<强> 10。调试和优化LINQ查询
如果您想调试和优化查询,那么LINQ Pad就是一个很好的工具。我是LINQ Pad的忠实粉丝。它对查询构造,调试和优化非常有用。
IQueryable lstCus = from customer in mobjentity.tblCustomers
where customer.City == "Delhi"
select customer;
lstCus.Dump();
LINQ Pad的转储方法在结果窗口中给出上述查询的结果。