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

建站小程序快速上线wordpress好用的编辑器插件

建站小程序快速上线,wordpress好用的编辑器插件,羽毛球网站建设网站,素材网站都有哪些当您使用LINQ来处理数据库时#xff0c;这种体验是一种神奇的体验#xff0c;对吗#xff1f;你把数据库实体像一个普通的收集#xff0c;使用Linq中像Where#xff0c;Select或者 Take#xff0c;这些简单的使用就能让代码可用了。但是#xff0c;让我们考虑一下这里是… 当您使用LINQ来处理数据库时这种体验是一种神奇的体验对吗你把数据库实体像一个普通的收集使用Linq中像WhereSelect或者 Take这些简单的使用就能让代码可用了。但是让我们考虑一下这里是如何通过动态查询和表达式树实现此功能的幕后发生的事情。您编写的LINQ查询将转换为SQL(或其他方式)并将该SQL查询发送到数据库。然后将数据库的响应映射到C对象。但是如何完全转换为SQL在本文中您将看到诸如Entity Framework和MongoDB C驱动程序之类的框架如何使用表达式树进行转换。您将看到如何亲自使用表达式树来构建动态查询。这些查询是您无法在编译时创建的查询因为您将知道该查询仅在运行时的外观。对可查询树和表达式树进行揭秘考虑以下使用Entity Framework 6的C代码DbSetStudent students context.Students;var billie await students.Where(s s.StudentName Billie).ToListAsync();执行时实体框架会产生以下SQL查询SQL:SELECT [Extent1].[StudentID] AS [StudentID], [Extent1].[StudentName] AS [StudentName], [Extent1].[DateOfBirth] AS [DateOfBirth], FROM [dbo].[Students] AS [Extent1] WHERE NBillie [Extent1].[StudentName]请注意WHERESQL查询中有一个操作。那不是很明显。如果SQL不包含WHERE则所有学生都将从数据库中带走并且筛选将在.NET进程中执行。实际上以下代码可以做到这一点//BAD:DbSetStudent students context.Students;FuncStudent, bool predicate s s.StudentName Billie;var x students.Where(predicate).ToList();在最后一个示例中SQL查询使所有学生进入流程并将其映射到常规集合。不同之处在于在第一段代码中lambda是一个Expression它允许实体框架将其添加到SQL查询中。在第二段代码中lambda是a Func因此将Where执行操作符之前的所有操作并将其转换为常规IEnumerable集合然后执行其余的查询。第二段代码在性能内存和网络方面很糟糕。我们从网络中获取了许多对象而不是仅从数据库中获取一个项目。然后我们使用CPU将它们序列化为C对象。并用完内存将它们存储在进程的堆中。因此让我们回到第一段代码。如何await students.Where(s s.StudentName Billie).ToListAsync()产生一个包含的SQL查询WHERE NBillie [Extent1].[StudentName]答案是表达树。该代码s s.StudentName Billie实际上是一个结构化查询可以通过编程将其分解为节点树。在此示例中有6个节点。最顶层的节点是lambda表达式。左侧是lambda参数。在它的右边是Equal表示表达式的lambda主体。实体框架具有遍历这些表达式树并构造SQL查询的算法。其他数据源提供程序(如Mongo DB C驱动程序)也会发生同样的事情除了它会构造一个MongoDB json查询。C表达式树在第一段代码中类型s s.StudentName Billie为Expression。这表示生成树的表达式树Func。该Where子句接受这种类型的参数因为aDbSet实现了IQueryable接口这要求它与表达式树配合使用。相反常规集合(如数组或a List)IEnumerable意味着它将lambdas s.StudentName Billie用作常规函数。好的但是我该如何利用它呢在大多数情况下使用表达树的人们就是在构建世界实体框架的人们。但是在某些特定情况下它变得非常有用。这是我们最近在Ozcode[1](我的日常工作)中遇到的一个用例我们想在名为Error的数据库实体上创建动态服务器端过滤。该实体具有许多属性我们希望允许用户对其进行过滤。因此过滤应根据被允许UsernameCountryVersion或任何其他财产。这是我们需要实现的APIIQueryableError _errors; public IEnumerableError GetErrors(string propertyToFilter, string value){ /*..*/} 在这种情况下propertyToFilter是的属性Error。使用常规的LINQ唯一的方法就是使用巨大的switch / case语句。有点像这样IQueryableError _errors;public IEnumerableError GetErrors(string propertyToFilter, string value){ switch (propertyToFilter) { case Username: return await _errors.Where(e e.Username value).ToListAsync(); case Country: return await _errors.Where(e e.Country value).ToListAsync(); case Version: return await _errors.Where(e e.Version value).ToListAsync(); // ... }}您可能会同意这不是理想的选择。除了必须编写所有这些东西之外它还非常容易出现错误。如果添加了属性怎么办如果重命名怎么办整个事情一团糟。通过动态查询和表达式树可以实现此功能的方法如下private async static TaskIEnumerableError GetErrors(string propertyToFilter, string value){ var error Expression.Parameter(typeof(Error)); var memberAccess Expression.PropertyOrField(error, propertyToFilter); var exprRight Expression.Constant(value); var equalExpr Expression.Equal(memberAccess, exprRight); ExpressionFuncError, bool lambda Expression.LambdaFuncError, bool(equalExpr, error); return await _errors.Where(lambda).ToListAsync();}这里的每一行代码代表表达式树中的一个节点。它们共同构成了最高节点-lambda。然后可以在LINQ中使用动态表达式并生成服务器端SQL查询。我认为很好。解决此问题的另一种方法是构建自定义SQL查询字符串。在Ozcode中我们使用的是MongoDB因此SQL不适合使用但我们可以创建一个自定义的MongoDB JSON查询字符串。也不是太难但是我认为表达式树方法更加灵活和可靠。一方面您可以将其放在LINQ中并与其他LINQ运算符组合。此外当有诸如Entity Framework之类的经过测试的框架可以为您执行此操作时为什么还要编写自己的查询。概要回顾一下。这是本文中的一些关键点•常规函数/委托与表达式之间的区别在于表达式可以用结构化树表示。可以轻松地分析该树以创建诸如数据库查询之类的东西。•支持表达式的数据源实现该IQueryable接口。•如果您无法使用表达式(以及使用常规方法或委托)则查询将在服务器端而不在数据库端这对于性能而言将是可怕的。•使用lambda(不带主体)时表达式是无缝创建的因此这些年来您可能一直都在这样做。•您可以自己使用表达式树来创建动态查询。这在无法在编译时仅在运行时构建查询的情况下很有用。References[1] Ozcode: https://oz-code.com[2]: https://www.mediavine.com/
http://www.yutouwan.com/news/333629/

相关文章:

  • 网站建设规划书Wordpress设置分类加密
  • 做qq头像的网站学校模板图片
  • 营销型网站sem投放策略wordpress化妆品模板
  • 做网站搞笑口号做网站建设销售
  • wap网站建设案例网站建设哪里去学
  • 请问做网站需要什么免费产品推广软件
  • 展示型网站 数据库四川省建设厅招投标网站
  • 开锁换锁公司网站模板深圳市造价信息网官网
  • 唐山模板网站建设网件路由器无线中继
  • 江苏省建设局报考网站什么是网络营销基本思想
  • 自贡建设专业网站设计空调安装东莞网站建设
  • 怎么在悉尼做网站下载的网站模版怎么用
  • 企业内部网站成都公司网站制作公司
  • 花园设计网站推荐成立网站公司需要什么
  • 仿做网站可以整站下载器吧wordpress 重装教程
  • 建设网站需要什么基础知识网站如何改字体
  • 软文自助发稿软件开发 网站建设搜索引擎营销的常见方式
  • 档案馆建设网站中国建工社微课程官网
  • 哪做网站某公司网页设计
  • 找网站的方法各大网站域名大全
  • 人力资源网站怎么做杭州网站建设|网站设计
  • 网站可以做音频线吗做网站服务器还是虚拟空间好
  • 中国行业网站联盟怎么创网站赚钱吗
  • 网站建设教程免费湖南岚鸿重庆公司公章查询
  • 北京中小企业网站建设网站不备案做seo没用
  • php做网站切换语言网站建设公司广州增城
  • 永州网站制作建设app制作教学课程
  • 解析域名就可以做网站红动中国素材网免费下载
  • 网站建设客户案例做网站和做网页的区别
  • 太原网站建设51sole长沙网站排名