当前位置: 首页 > news >正文

二次网站开发平台运营软件有哪些

二次网站开发平台,运营软件有哪些,网站建设市场价格,wordpress中文主题免费下载点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章#xff0c;至今适用#xff08;没错#xff0c;我说的就是适用于EF Core#xff09;。因此使用微信重新推送#xff0c;希望能帮到大家。自从我用了EF#xff0c;每次都很关心是否有潜在的性能问题。所以每次… 点击上方蓝字关注“汪宇杰博客”这是一篇我在2012年写的老文章至今适用没错我说的就是适用于EF Core。因此使用微信重新推送希望能帮到大家。自从我用了EF每次都很关心是否有潜在的性能问题。所以每次我写LINQ查询都会使用SQL Profiler看一下实际生成的SQL语句以便发现潜在的性能问题。也强烈建议大家这么去做以免日后软件大了出了问题很难查。只选择某列或某些列有些时候在C#里写LINQ虽然看着舒服但性能不一定好所以有必要做一些调整。比如这种情况我需要知道一篇文章的点击数仅此而已我可能会写context.Post.FirstOrDefault(p p.Id postId).Hits;或者context.Post.Find(postId).Hits;我期待着他们只去数据库里筛选Hits这一列的数据然而通过SQL Profiler会发现这两条语句居然把全部列都给select出来了访问Hits的操作实际是在内存中进行的。虽然小表看不出性能问题但万一你的表里有一列是存文件字节流byte的那这样的操作可能会很慢并且消耗额外的网络传输所以不能忽视这个问题。其实我只要稍作调整就能避免这个问题但会LINQ语句难看一点context.Post.Where(p p.Id postId).Select(p p.Hits).FirstOrDefault();最终生成的native sql是这样的exec sp_executesql NSELECT TOP (1) [Extent1].[Hits] AS [Hits]FROM [dbo].[Post] AS [Extent1]WHERE [Extent1].[Id] p__linq__0,Np__linq__0 uniqueidentifier,p__linq__0850C3A86-6C3D-408B-8099-61EDA559F804真正的只select了Hits一个字段。ToList()的问题其实EF很多时候的性能问题都是关系到查询执行时机的。我们通常的意图是首先建立一个查询表达式只是build而不execute。执行的时机是用到这个表达式结果的时候才去执行。在公司码程序的时候我看到好多同事用EF写完查询喜欢直接调用ToList()方法。有时候这会造成很大的性能问题。因为单纯声明一个linq表达式并不会立即执行SQL查询然而一旦在后面加上ToList()就会立即去执行。如果你只是想根据条件选择其中一些数据而非全部的话那ToList()以后再筛选就是从内存里执行了并不是把你的条件转换成sql的where语句去执行。var query from ..... // 建立查询但不执行 var result query.ToList(); // 立即执行查询所以你应当尽量避免从ToList()后的结果中再去查找自己想要的元素。IQueryable, IEnumerable在这两个接口的选择上我偏向使用IQueryable。大部分时候这两个接口在使用上的表现都是一致的但如果你要做的是一个不确定的查询意思是这个查询表达式不是一次性确定的对于它的结果可能由别的类来选择到底select哪些东西这时候就要用IQueryable。比如我有一个数据层方法public IEnumerableEdiBlog.Core.Entities.Post GetAllPost(){    return context.Post;}很显然它会被系统中的其他方法调用而这些调用者希望得到的结果都各不相同。通常的操作就是再拼一个where语句上去var myResult postDa.GetAllPost().Where(...)但这时很不幸的是where语句中的条件并不是转换为native sql去执行的它是在内存中筛选的。这是一个比较阴的性能问题。所以文章一开始我就建议大家多用SQL Profiler看看自己的LINQ是怎么执行的。如果把返回类型换成IQueryable那么你的where语句就可以转化为SQL执行。public IQueryableEdiBlog.Core.Entities.Post GetAllPost(){    return context.Post;}关于这两个接口在StackOverflow上有一个比较好的帖子大家可以自己看一下http://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet“IEnumerable: IEnumerable is best suitable for working with in-memory collection. IEnumerable doesn’t move between items, it is forward only collection.IQueryable: IQueryable best suits for remote data source, like a database or web service. IQueryable is a very powerful feature that enables a variety of interesting deferred execution scenarios (like paging and composition based queries).”在MSDN论坛上也有个比较直观的答案IQueryable returns a queryable that is a query you could still be enriched before really sending it to the server.IEnumerable returns a list that is the actual querying took place and you get the results. ToList is isued to force running the query and returning these enumerable results...So in short :- use IQueryable if you want to return a base query that could be further enhanced before running it server side (by enumerating its items)..- use IEnumerable/ToList if you want to return a list that has been retrieved from the db计算个数Count()和Count这个是最容易被坑也是非常严重的一个性能问题。当我们需要统计符合某条件的记录的条数时我们希望SQL语句是SELECT COUNT(*) ... 这种形式的。然而下面这个看似很自然的写法却会导致不希望的结果context.Category.FirstOrDefault(p p.Name categoryName).Posts.Count;这是我博客里用来统计某分类下文章数目的语句当然因为发现性能问题现在已经不是这么写了。它产生的SQL并不是SELECT COUNT而是分成2条。下面是SQL Profiler抓到的exec sp_executesql NSELECT TOP (1) [Extent1].[Id] AS [Id], [Extent1].[Name] AS [Name], [Extent1].[DisplayName] AS [DisplayName]FROM [dbo].[Category] AS [Extent1]WHERE [Extent1].[Name] p__linq__0,Np__linq__0 nvarchar(4000),p__linq__0NASPNETexec sp_executesql NSELECT [Extent2].[Id] AS [Id], [Extent2].[Title] AS [Title], [Extent2].[Slug] AS [Slug], [Extent2].[PubDate] AS [PubDate], [Extent2].[PostContent] AS [PostContent], [Extent2].[Author] AS [Author], [Extent2].[CommentEnabled] AS [CommentEnabled], [Extent2].[IsPublished] AS [IsPublished], [Extent2].[Hits] AS [Hits], [Extent2].[Rators] AS [Rators], [Extent2].[Rating] AS [Rating], [Extent2].[ExposedToSiteMap] AS [ExposedToSiteMap], [Extent2].[DisplayFrom] AS [DisplayFrom], [Extent2].[DisplayTill] AS [DisplayTill], [Extent2].[LastModifyOn] AS [LastModifyOn], [Extent2].[PublishToRss] AS [PublishToRss]FROM  [dbo].[PostCategory] AS [Extent1]INNER JOIN [dbo].[Post] AS [Extent2] ON [Extent1].[PostId] [Extent2].[Id]WHERE [Extent1].[CategoryId] EntityKeyValue1,NEntityKeyValue1 uniqueidentifier,EntityKeyValue13FEB11A2-6E36-4DCE-8C02-614BEF7ACC62可以看到EF做了两件事第一件事是查找Name为ASPNET的Category然后用这个Category的Id去找它所有的Post最后做Count的其实是.NET在内存里进行的。这显然把我们不需要的信息都给SELECT出来了。我们只需要一个Count为毛会这么复杂呢回顾第一条我所讲过的。不难发现。在FirstOrDefault(...)之后访问的属性都是在内存里进行的。所以当我们访问Category.FirstOrDefault(p p.Name categoryName)的时候就生成了第一条SQL语句。紧跟其后的“.Posts”是Category对象的导航属性EF会用lazy load去加载这个category所有的post所以就生成了第二条SQL语句。再紧接其后的Count就自然而然在内存里进行了。如果要让代码尽量去生成LINQ to SQL有个很简单的原则就是尽量用LINQ、Lambda表达式这样EF才可能帮我们翻译。C#里的Count有两种。Enumerable.Count()是方法List.Count是属性。一旦一个东西变成了List你再去Count就必定是在内存里进行的了。所以在EF中要进行Count操作应该这样写context.Post.Count(p p.Categories.Any(q q.Name categoryName));这时Count()接受了一个lambda表达式LINQ to SQL就能准确翻译为“SELECT COUNT”了SELECT [GroupBy1].[A1]  AS [C1]FROM   (           SELECT COUNT(1)      AS [A1]           FROM   [dbo].[Post]  AS [Extent1]           WHERE  EXISTS (                      SELECT 1 AS [C1]                      FROM   [dbo].[PostCategory] AS [Extent2]                             INNER JOIN [dbo].[Category] AS [Extent3]                                  ON  [Extent3].[Id] [Extent2].[CategoryId]                      WHERE  ([Extent1].[Id] [Extent2].[PostId])                             AND ([Extent3].[Name] ASPNET)                  )       )                AS [GroupBy1]现在性能要明显好很多.NET编程委提醒您ORM千万种EF最方便使用不规范性能两行泪
http://www.zqtcl.cn/news/475482/

相关文章:

  • wordpress链接样式设置方法网络seo推广培训
  • 建站系统wordpress下载企业网站建设课程体会
  • 网站资源规划怎么写wordpress怎么解绑域名
  • 建湖企业做网站多少钱网页开发工具软件
  • WordPress怎么建小站wordpress替换谷歌字体库
  • ps建设网站步骤佛山做外贸网站特色
  • 杭州做代发的网站有哪些计算机基础网站建设和网络安全
  • 做汽配外贸是在哪个网站做山东百度推广
  • 网站类型大全cms监控软件下载官网
  • 网站设计制作 建网站免费asp地方门户网站系统
  • 凡科网做的网站保存后就上传了吗东莞网站推广建设
  • 网站推广案例闲鱼上做网站
  • 网站 做购物车分类信息网站建设系统
  • 网站做弹窗坂田建设网站
  • 北仑网站推广保险网站建设
  • 文山城乡建设部网站首页个人网站怎么注册
  • 西安企业建站wordpress外部调用后台
  • 江苏手机网站建设公司域名查询ip解析
  • 网站上的用户注册怎么做的苏州网站建设制作服务商
  • 网站开发模版宁波网
  • 以鹦鹉做头像的网站wordpress post是什么
  • 公司怎么建立自己网站做网站需要编码吗
  • 网站域名根目录在哪里wordpress做跟随导航导航
  • 昆明网站建站推广it外包工作怎么样
  • 上海长宁网站建设公司WordPress 采集文章 图片
  • 紫色 网站网络设计的最后一个步骤是
  • 广东省建设安全卡查询网站网站开发需要的语言
  • 网站的建设需要考虑什么问题投放广告的网站
  • 雅虎提交网站入口常州哪家做网站好
  • 哪些网站是503错误代码太原搭建网站的公司