当前位置: 首页 > 面试题库 >

LinqToSQL是否足够强大?难道不是更容易构建更强大但同样流畅的界面吗?

杜凯
2023-03-14
问题内容

在上一个问题中,我询问ORM库是否是次优解决方案,并收到了很多好评。当我进一步考虑该问题时,我得出的结论是,LinqToSQL(现在)的主要好处和LinqToEntities(在未来)的承诺在于它们能够减少程序代码与SQL之间的“不匹配”。鉴于LinqToSQL作为一种完整的数据查询语言的局限性,我不愿意同意它的优势远不止于此,但我想知道其他人的看法。

首先,程序代码与SQL之间的“不匹配”是什么意思?如果您曾经开发过数据库应用程序,那么您可能已经熟悉(和厌倦了)与数据库交互所需的步骤:设置所有参数,输入SQL命令,然后将预期结果手动转换回变量或代码中使用的实例。

LinqToSql通过使用“流利的”接口,lambda表达式,扩展方法等使此操作变得更加容易。最终结果是,很容易将本机C#标量类型推入数据检索调用中,并且易于自动生成本机C#类实例。从MS网站上获取以下示例:

var q =
   from c in db.Customers
   where c.City == "London"
   select c;
foreach (var cust in q)
   Console.WriteLine("id = {0}, City = {1}",cust.CustomerID, cust.City);

很酷!

那是什么问题呢?

好吧,正如我在顶部链接的文章中指出的那样,存在许多问题。在 最大的
为我的搅局者是人谁是SQL微创主管会马上打路障。不仅仅是许多替代SQL的结构不熟悉甚至笨拙(Group By?我们在LinqToSql中讨论的是 丑陋
的问题)。更大的问题是,有许多本机不支持的常见构造(例如DateDiff)。充其量,您可以“逃脱” Linq,然后将SQL代码提交到Linq调用流中。

因此,以允许您自由声明SQL但又使您轻松进行参数嵌入和自动转换为本机类的方式,简单地将SQL嵌入C#(或VB)中不是更好吗?例如,如果我们在一个类中仅实现六个函数,则可以编写如下代码(其中qry是查询类的实例):

var ListOfEnrollees = 
           qry.Command("Select b.FirstName, b.LastName, b.ID From ClassEnroll a inner join Folder b on (a.ClientID = b.ClientID) ")
             .Where ("a.ClassID", classID)
             .AND()
             .Append("(DateDiff(d, a.ClassDate, @ClassDate) = 0) Order By LastName;")
             .ParamVal(classDate)
             .ReturnList<EnrollListMemberData>();

命令 只是开始我们送行收集SQL语句时, 如果 开始我们的SQL Where子句,并进入第一个参数, 追加 更多的SQL大头钉,
ParamVal 刚刚进入一个参数值,以便与SQL参数上一行找到, ReturnList
做转换为类所需的魔术。请注意,这只是SQL:连接很简单,支持DateDiff(或任何其他SQL构造),等等。我们可以在SQL窗口中对其进行测试,然后将其剪切并粘贴到我们的代码中,并根据需要将其分解以输入我们的参数。再简单不过了。

现在,上面显示的基本构造对我来说简直太简单了,它可以使用 已经 拥有的SQL知识来处理 任何
SQL构造。我确实必须使用一些反射和其他一些很酷的新C#3构造来使ReturnList(和类似的调用)工作,但是总的来说,这非常简单。我还添加了许多功能,使界面更加流畅。所以,这是我的问题,也是我想听听社区意见的地方:
__

为什么我需要掌握LinqToEntities的复杂性,甚至会产生LinqToSql的开销?这难道不是给我LinqToSql给我的一切吗?除了奇异的关系到对象的映射之外,它是否还不包括LinqToEntities?

更新 :哈米什·史密斯(Hamish
Smith)在下面提出论点,即有朝一日,LINQ可能是一种功能全面的数据处理语言,其功能如此强大,甚至不需要SQL。这是一个重要的临界点论点,我没有讨论,但我同意。我的立场的实质是,尽管LinqToSql有一些实际的优势,但仍然
远远 没有达到Hamish的目标。这是一个非常现实的重大缺陷。

Hamish还正确地指出,我仍在使用嵌入式SQL-我尚未“解决”该问题。但是对我来说,这是一个 功能,
而不是错误。SQL在选择和操作关系数据(毕竟是我们正在使用的数据)方面仍然要好得多,我 希望
能够使用它来设计解决方案。我认为嵌入式SQL的问题不仅仅在于嵌入式SQL与C#之间的阻抗不匹配。但是,通过使用受Linq启发的C#3的新功能,我可以在很大程度上消除这种“阻抗不匹配”并获得两全其美的效果。


问题答案:

因此,以允许您自由声明SQL但又使您轻松进行参数嵌入和自动转换为本机类的方式,简单地将SQL嵌入C#(或VB)中不是更好吗?

我通常所做的非常接近这一点。我在存储过程中编写SQL,因此可以自由使用真正的SQL。在C#中,我使用Linq的DBML以自然的方式访问存储过程。这感觉就像两全其美。

真正的解决方案对我来说更简单:将SQL嵌入C#代码中,并让编译器生成强大的类。如果Visual Studio支持这一点,我怀疑有人会使用其他任何东西。

(总有人尝试创建实体框架并“架构”掉SQL的需求。据我所知,这仅仅是因为结果很难维护且非常缓慢而从未真正奏效。)



 类似资料:
  • 让聪明人干任何他们想干的事情。 UNIX 的一个特点就是非常高的灵活性,Xwindow 也具有这种灵活性。这种灵活性体现在哪里呢? UNIX 的程序一般都有很多参数,不管你现在用的着用不着,总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash, 通常缺省的命令行输入方式是 Emacs 方式,但是只要我编辑一个 .inputrc 文件,就可以把它变成 vi 的输入方式,而

  • 问题内容: 目前,我正在使用带有LinearLayout Manager的RecyclerView和作为HeaderView的EditText来过滤列表的内容。 如果RecyclerView的内容小于RecyclerView本身,我想隐藏EditText。 如果其内容可以滚动,是否可以“询问” Recyclerview或LayoutManager? 谢谢你们。 问题答案: 当最后位置的项目完全可见

  • 问题内容: 我正在尝试使用机械化方法在网站上解析和提交表单,但是似乎内置表单解析器无法检测到表单及其元素。我怀疑它在格式不正确的HTML上令人窒息,我想尝试使用更好地设计用于处理不良HTML(例如lxml或BeautifulSoup)的解析器对其进行预解析,然后将经过整理,清理的输出馈送到表单中解析器。我不仅需要机械化的方式来提交表单,而且还需要维护会话(我正在登录会话中使用此表单。) 如果确实有

  • 问题内容: 根据标题,您是否找到了足以满足您需求的默认Java日志记录框架? 您是否使用替代日志记录服务,例如log4j或其他服务?如果是这样,为什么?我想听听您对有关不同类型项目中的日志记录要求的任何建议,以及在实际需要和/或有用时集成框架的建议。 问题答案: 使用第三方库记录依赖项 在大多数情况下,Java JDK日志记录本身并不足够。但是,如果您有一个使用多个开源第三方库的大型项目,您将很快

  • 因此,我正在使用本指南创建一个投资组合滑块(https://github.com/lmgonzalves/momentation-slider),但我不喜欢按钮的大小,我想要使其更大。看起来我在CSS文件中做的任何事情都不会改变任何东西。按钮工作和CSS本身工作,我只是不能改变按钮的大小... 这是portfolio-carousel.css的链接(https://github.com/lmgon

  • 问题内容: 我编写了此sql查询以在表中进行搜索: 该表包含以下行,例如: 太空公司。 温泉度假胜地。 温泉酒店。 备件。 没有主题关键字。 我想知道如何编辑此查询,以便它返回如下排序的结果: 2温泉度假村 3号温泉酒店 1太空公司 4备件 表示首先包含确切单词的项目,然后包含类似词语的项目。 问题答案: 就像是 应该可以。 实际上这会更好 FWIW我做了一些快速测试,如果“名称”在NONCLUS