【问题标题】:Pros and Cons of LINQ (Language-Integrated Query)LINQ(语言集成查询)的优缺点
【发布时间】:2008-11-07 06:33:02
【问题描述】:
  • LINQ(语言集成查询)的优缺点是什么?
  • 使用 LINQ 的最佳和最差情况是什么?
  • 您从使用 LINQ 中受益或没有受益?
  • 哪些数据源从 LINQ 中受益最少和最多?

【问题讨论】:

  • 似乎是社区 Wiki 问题的好候选人

标签: .net linq


【解决方案1】:

我是 LINQ 的忠实拥护者——尽管它需要被正确看待,而不是被视为灵丹妙药。

优点:

  • 声明式方法使查询更易于理解且更紧凑
  • 可扩展性和表达式树允许对多个源进行基本一致的查询
  • 甚至可以通过 LINQ to Objects 以外的方式实现进程内查询 - 例如。并行 LINQ 和我自己的 Push LINQ 框架。非常灵活。
  • 非常好对于最容易理解的进程内查询很有用
  • 很高兴能够避免在字符串等中使用 SQL
  • 默认提供广泛的运算符,并且可以为 LINQ to Objects 轻松添加其他运算符
  • 主要为 LINQ 引入的语言功能可广泛应用于其他地方(对 lambdas 来说是的)

缺点:

  • 查询表达式理解不够好,并且被过度使用。简单的方法调用通常更短更简单。
  • 提供商之间不可避免的不一致 - 阻抗不匹配仍然存在,这是合理的,但需要了解
  • 总有一些事情可以在 SQL 中完成,但在 LINQ 中却不行
  • 如果不了解发生了什么,很容易编写效率非常低的代码
  • 很难编写 LINQ 提供程序。这可能是不可避免的,但如果 Microsoft 提供更多指导,我们将不胜感激。
  • 对于大多数开发人员来说,这是一种思考数据访问的新方式,需要时间来理解以渗透
  • 不是专门针对 LINQ,而是与它相关 - 在 C# 中发现扩展方法的方式不够精细
  • 有些操作符“缺失”,尤其是在排序以外的其他操作中,OrderBy 的等价物 - 例如。找到具有最大值的项目
  • 人们对延迟执行和流式处理知之甚少(但正在改进)
  • 由于延迟执行和流式传输,调试可能非常棘手
  • 在某些特定情况下,LINQ 可能比手动代码慢得多。你越了解内部运作,你就能更好地预测这一点。 (当然,如果性能对您很重要,您应该围绕它进行适当的测试。)

我发现在处理进程内查询时最好。它们很容易预测、理解和扩展。 LINQ to XML 和 Parallel LINQ 等互补技术非常棒。 LINQ to Objects 几乎可以在任何地方使用。

LINQ to SQL 等在适当的地方非常好,但它们更难理解并且需要更多的专业知识。它们也仅适用于代码的某些区域。

【讨论】:

  • 他们应该重命名站点 Skeetoverflow IMO。
  • @Nathan:是的,缺点列表令人望而生畏——但优点更重要 :) 当我用 Java 编写代码时,我一直想念 LINQ :(
  • 是不是不到一半的 con 列表是开发人员的错,而不是 LINQ 本身?
  • @jfar:有可能,但它们仍然是“缺点”。
  • @jfar:由于易于阅读和易于使用是语言的优点,因此易于误解和易于创建的错误应该是缺点:)
【解决方案2】:

我最喜欢的部分:使用它们来简化编写单元测试。 IEnumerable 链也敦促我在我的代码中编写更流畅的接口。

缺点:Lambda 和扩展方法是我的锤子,所有问题都是钉子。

总体而言:为我的 C# 编程注入了新的活力。

【讨论】:

  • 这些是非常有说服力的陈述。同意 100%。
【解决方案3】:

它们存在一个问题,即通过延迟执行将异常从 try catch 块中偷偷溜出。

例如:

var l = new List<int>() {1, 2, 3};
try
{
    l.Select(x => x / 0);
}
catch
{
    // error
}

l.elementAt(0); // exception occurs here outside of the try catch

当您第一次遇到它时可能会很棘手,尤其是当调试器会将您指向 try-catch 中的代码时。

否则我发现它们非常有用并且非常节省时间。

【讨论】:

  • 所写的示例可以正常工作。正如你所说,LINQ 可能是偷偷摸摸的,但不是你暗示的那样:) 对 Select 的调用将什么都不做 - 它会返回 IEnumerable ,需要对其进行迭代以获得一些结果。因此不会引发异常,这是正常的并且是设计使然,而且不会以任何方式修改集合。因此最后一次调用将成功返回 1。
【解决方案4】:

专业版:

缺点:

  • 就像任何新技术一样,有太多人不理解但仍在使用它

@Jon Skeet - 另一个很好的回应,你抢了所有人的风头:P。我完全同意编写提供程序的难度,我目前正在编写中!你熟悉 Bart De Smet 吗?他有很多这样做的好例子。

【讨论】:

    【解决方案5】:

    我主要使用 LINQ 来处理对象的集合。 LINQ 与对象集合完美配合,在大多数情况下无需谓词函数。

    我不久前尝试使用 LINQ to SQL,但发现它功能不足且笨拙。特别是我无法让自己使用 SQL 数据库类设计器。也许它确实在数据库上提供了智能感知,但是当你有 SQL 时谁需要它?

    不过,让我告诉你,了解更多关于 LINQ 的信息当然是个好主意,因为未来的应用程序只会越来越多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 2017-07-17
      • 1970-01-01
      相关资源
      最近更新 更多