LINQ和Java

LINQ已经非常成功,但在.NET生态系统中也引起了争议。 许多人正在Java世界中寻找可比的解决方案。 为了更好地理解什么是可比的解决方案,让我们看一下LINQ解决的主要问题:

查询语言通常是具有许多关键字的声明性编程语言。 它们提供的控制流元素很少,但是具有很高的描述性。 最受欢迎的查询语言是SQL ,这是ISO / IEC标准化的结构化查询语言,主要用于关系数据库。

声明式编程意味着程序员不会明确声明其算法。 相反,他们描述了他们想要获得的结果,从而将算法计算留给了其实施系统。 一些数据库已经非常善于解释大型SQL语句,并基于语言语法和元数据应用了SQL语言转换规则。 有趣的一读是汤姆·凯特 ( Tom Kyte)的元数据问题 ,暗示了甲骨文基于成本的优化工具所付出的巨大努力。 对于SQL Server,DB2和其他领先的RDBMS,可以找到类似的论文。

LINQ-to-SQL不是SQL

LINQ是一种完全不同的查询语言,它允许将声明性编程方面嵌入到.NET语言(例如C#或ASP)中。 LINQ的一个优点是,C#编译器可以在C#语句中间编译类似于SQL的内容。 从某种意义上说,LINQ对.NET而言,SQL对PL / SQL,pgplsql或对Java的jOOQ而言 ( 请参阅我之前有关PL / Java的文章 )。 但是与嵌入实际SQL语言的PL / SQL不同, LINQ-to-SQL并非旨在在.NET中对SQL本身进行建模。 它是更高级别的抽象,为尝试统一使用一种语言对各种异构数据存储进行统一查询提供了方便。 这种统一将产生与ORM相似的阻抗失配 ,甚至可能更大。 尽管相似的语言可以在某种程度上相互转换,但是对于高级SQL开发人员而言,预测甚至是非常简单的LINQ语句将生成什么实际的SQL代码也变得非常困难。

LINQ示例

当查看LINQ-to-SQL文档给出的一些示例时,这一点变得更加清楚。 例如Count()聚合函数:

System.Int32 notDiscontinuedCount =(from prod in db.Productswhere !prod.Discontinuedselect prod).Count();Console.WriteLine(notDiscontinuedCount);

在上面的示例中,尚不清楚立即将.Count()函数转换为带括号的查询中的SQL count(*)聚合函数(然后为什么不将其放入投影中?),或者是否将其应用仅在执行查询后,才在应用程序内存中。 如果需要将大量记录从数据库传输到内存,则后者将是禁止的。 根据交易模型的不同,它们甚至需要被读取锁定!

此处给出了另一个示例,其中解释了分组 :

var prodCountQuery =from prod in db.Productsgroup prod by prod.CategoryID into groupingwhere grouping.Count() >= 10select new{grouping.Key,ProductCount = grouping.Count()};

在这种情况下,LINQ对它的语言方面建模完全不同于SQL。 上面的LINQ where子句显然是SQL HAVING子句。 into grouping是将元组into grouping的别名,这是一个很好的主意。 但是,它不会直接映射到SQL,并且LINQ必须在内部使用它来生成类型化的输出。 当然,很棒的是静态类型的投影,之后可以直接在C#中重用!

让我们看另一个分组示例:

var priceQuery =from prod in db.Productsgroup prod by prod.CategoryID into groupingselect new{grouping.Key,TotalPrice = grouping.Sum(p => p.UnitPrice)};

在此示例中,C#的功能方面嵌入到LINQ的Sum(p => p.UnitPrice)聚合表达式中。 TotalPrice = ...只是简单的列别名。 以上让我有很多未解决的问题。 在SQL查询返回部分结果集之后,如何控制哪些部分将真正转换为SQL,以及哪些部分将在我的应用程序中执行? 我如何预测lambda表达式是否适合LINQ聚合函数,以及何时将导致将大量数据加载到内存中以进行内存聚合? 并且:编译器会警告我,它无法弄清楚如何生成C#/ SQL算法组合吗? 还是这只会在运行时失败?

去LINQ还是不去LINQ

不要误会我的意思。 每当我在LINQ手册中寻找灵感时,我都会强烈希望在项目中进行尝试。 它看起来很棒,而且设计合理。 关于Stack Overflow也有很多有趣的LINQ问题 。 我不介意在Java中使用LINQ ,但是我想提醒读者,LINQ 不是 SQL。 如果您想控制SQL,则LINQ或LINQesque API可能是错误的选择,原因有两个:

  1. 某些SQL机制无法用LINQ表达。 与JPA一样,您可能需要使用普通SQL。
  2. 某些LINQ机制无法用SQL表示。 与JPA一样,您可能会遇到严重的性能问题,因此将再次诉诸于纯SQL。

选择LINQ或其“ Java实现”时,请注意上述内容! 使用SQL(即JDBC, jOOQ或MyBatis )进行数据提取,并使用Java API(例如Java 8的Stream API)进行内存中后处理可能会更好。

类似于LINQ的库在Java,Scala中建模SQL

  • jOOQ: http : //www.jooq.org
  • Sqltyped: https : //github.com/jonifreeman/sqltyped

类似于LINQ的库在Java,Scala中抽象化SQL语法和数据存储

  • Quaere: http ://quaere.codehaus.org
  • JaQu: http ://www.h2database.com/html/jaqu.html
  • Linq4j: https : //github.com/julianhyde/linq4j
  • 光滑: http : //slick.typesafe.com/

参考:来自JACG ,SQL和AND JOOQ博客的JCG合作伙伴 Lukas Eder的LINQ和Java 。

翻译自: https://www.javacodegeeks.com/2013/07/linq-and-java.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样 测试 某个 端口 是否打开

我们一般最常见的工具是telnet,但是telnet使用的是tcp协议,换句话说telnet只能检测tcp的这个端口打开了没。 方法很简单,假设我们要看192.192.193.211这个IP的tcp 22端口是否打开,则运行telnet 192.192.193.211 22 来查看 如果cen…

linux用户空间注册按键事件,linux下获取按键响应事件

1、问题通过一个死循环将读取键盘对应的设备文件将触发键盘事件在屏幕上打印出来,按esc退出程序代码是在unbuntu10.04编译执行通过的2、input_event描述在Linux内核中,input设备用input_dev结构体描述,使用input子系统实现输入设备驱动的时候…

CSS实现单行与多行文字省略(truncation)

在上一篇文章小div布局之卡片堆叠(card-stacking)中有多行文字溢出省略的效果,这篇文章就对这种效果(包括单行文字溢出省略)的实现做个简单的记录,以防自己忘记。具体来说,就是要实现这种文字排…

位运算的使用例子

class Data { public:enum Permission{allowSelect 1 << 0,allowUpdate 1 << 1,allowInsert 1 << 2,allowDelete 1 << 3}; public:Data():flag(0){};~Data(){};/*添加某权限*/void enable(int permission){flag | permission;}/*删除某权限*/void…

事务性Lucene

许多用户不喜欢Lucene API的事务性语义&#xff0c;以及这在搜索应用程序中如何有用。 首先&#xff0c;Lucene实现了ACID属性&#xff1a; 一个 tomicity&#xff1a;当您在更改&#xff08;添加&#xff0c;删除文件&#xff09; IndexWriter会话&#xff0c;然后提交&#…

logback配置详解和使用

最近知道一种打印日志的新方法&#xff0c;在此做一下学习总结。 转自&#xff1a;行走在云端的愚公 https://www.cnblogs.com/warking/p/5710303.html 一、logback的介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网站&#xff1a; http://logback.qos.ch。它当前…

linux下iostat命令无效,linux iostat命令详解

iostatiostat用于输出CPU和磁盘I/O相关的统计信息.命令格式:iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ] ][ interval [ count ] ]1)iostat的简单使用iostat可以显示CPU和I/O系统的负载情况及分区状态信息.直接执行i…

css样式表

样式表&#xff1a; 一。内联&#xff1a;写在body中 直接在内容的标签中添加style属性&#xff1a;例如<div style"...">1234</div> 二。内嵌&#xff1a;写在head中 一般写在标题标签的后面&#xff0c;添加<style type"text/css"&g…

RAID技术超详细讲解

RAID 技术是一种多磁盘技术&#xff0c;面对数据的各方面有着两面性的影响&#xff0c;整体来说优点大于缺点的&#xff0c;下面我将详细介绍一下 RAID &#xff0c;简称磁盘阵列技术。 一、RAID 概述 1988 年美国加州大学伯克利分校的 D. A. Patterson 教授等首次在论文 “A C…

集群应用服务器环境中会话管理(复制)的Oracle Coherence最佳实践

Oracle Coherence是一种内存中数据网格产品&#xff0c;也广泛用于跨应用程序服务器节点集群的会话复制。 它支持各种应用程序服务器&#xff0c;例如WebLogic&#xff0c;WebSphere&#xff0c;Tomcat&#xff0c;JBoss等。Coherence * Web是会话管理模块&#xff08;基于Cohe…

自适应居中

一、窗体居中 position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto; /*height: 50px; width: 165px; */ 简析&#xff1a; position:固定位置显示&#xff08;absolute|fixed&#xff09;&#xff1b; 【absolute&#xff1a;窗口大小由上层position为ab…

linux ip地址漂移,Linux 实现高可用性(HA) —之ip 漂移方法(vrrp)

在日常的系统管理当中,某些应用对可用性要求比较高,简单的冷备是不能满足需求,所以才需要双机热备即HA.根据此应用要求,我们介绍一个软件实现高可用性.keepalived是Linux下一个双机热备的软件&#xff0c;可提供vrrp以及health-check功能&#xff0c;目前仅用它提供双机漂移ip,…

Go语言核心之美 1.5-作用域

变量的作用域是指程序代码中能够有效使用这个变量的范围。不要将作用域和生命期混在一起。作用域是代码中的一块区域&#xff0c;是一个编译期的属性&#xff1b;生命期是程序执行期间变量存活的时间段。在此时间段内&#xff0c;变量能够被程序的其他部分所引用&#xff0c;是…

BootStrap_01之全局样式

1、响应式网页&#xff1a; ①Responsive Web Page&#xff1a;一个可以根据浏览设备的不同&#xff0c;而自动更改布局、图片、文字效果的网页&#xff1b; ②构成&#xff1a;不能固定宽度&#xff0c;必须流式布局&#xff1b;文字和图片大小随容器大小而改变&#xff1b;CS…

Java安全教程–创建SSL连接和证书的分步指南

在有关应用JEE安全性的系列文章中&#xff0c;我们为您提供了另一个有关如何在Java EE应用程序中创建SSL连接和创建证书的详细教程。 如我们之前的文章中所述&#xff0c; 安全套接字层&#xff08;SSL&#xff09;/传输层安全性&#xff08;TLS&#xff09;将启用客户端和Web服…

linux带宽最小的远程桌面,【图片】linux下哪种远程桌面服务最快?_linux吧_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼I stumbled upon this while researching xrdp, which is the only one you mentioned that I havent used. Some observations:NX Server: not so speedy (v3, still awaiting v4), might pose performance issues depending on y…

CentOS Vi编辑器

vim&#xff1a;通过vim a.cfg进入文档 i&#xff1a;编辑状态 ESC&#xff1a;返回不可编辑状态 dd&#xff1a;在不可编辑状态下&#xff0c;dd可删除光标所在的行&#xff0c;2dd删除两行&#xff0c;以此类推 u&#xff1a;在不可编辑状态下&#xff0c;u可恢复删除的行 yy…

[转]CSS hack大全详解

转自&#xff1a;CSS hack大全&详解 1、什么是CSS hack? CSS hack是通过在CSS样式中加入一些特殊的符号&#xff0c;让不同的浏览器识别不同的符号&#xff08;什么样的浏览器识别什么样的符号是有标准的&#xff0c;CSS hack就是让你记住这个标准&#xff09;&#xff0c…

摆脱困境:将环境特定的Cron表达式与@Scheduled批注一起使用

Scheduled注释提供了一种在Spring驱动的应用程序中创建计划任务的简便方法。 我们可以使用它通过定期调度或cron表达式来调度我们的任务。 尽管时段调度也可能有用&#xff0c;但是cron表达式使我们对调度任务的调用有了更多的控制。 这就是为什么它们在现实生活中非常有用的原…

linux编译的so android闪退,android so库导致的闪退及tombstone分析

android中有3种crash情况&#xff1a;未捕获的异常、ANR和闪退。未捕获的异常一般用crash文件就可以记录异常信息&#xff0c;而ANR无响应表现就是界面卡着无法响应用户操作&#xff0c;而闪退则是整个app瞬间退出&#xff0c;个人感觉对用户造成的体验最差。闪退一般是由于调用…