【问题标题】:Is this lambda? if not what is it?这是拉姆达吗?如果不是,那是什么?
【发布时间】:2015-01-13 20:41:42
【问题描述】:

几天前,我正在尝试来自 Devart 的名为 EntityDAC 的用于 delphi 的新 ORM,当时我正在阅读特定于 LINQ 部分的文档,当我看到类似以下内容时:

Linq.From(Emp).Where(Emp['Sal'] > 1000)

不得不说,在我看到的第一刻就把我叫醒。表达式 "Emp['Sal'] > 1000" 不是 lambda 表达式?!因为试用版是这个组件没有提供源代码,所以我无法弄清楚函数/过程是如何声明的。

reference: http://www.devart.com/entitydac/docs/ -> Linq Queries -> Linq Syntax -> 向下滚动到 Where session

【问题讨论】:

  • 我认为这不可能是 Pascal,因为 Emp['Sal'] > 1000 表达式将在调用 Where 之前进行评估。你为什么不问问德瓦特?
  • EntityDAC 可用于 .net 和 delphi 并且肯定特别是 linq 部分是不同的。但是还有一章Specifying LINQ Query Arguments as String,我猜你必须在delphi中使用它
  • @DavidHeffernan 那么运算符重载呢?难道你不能通过在运算符重载代码中建立一个值列表然后在 where 中使用该列表来完成一些事情吗?您实际上返回了一个未使用的结果。
  • @Graymatter 是的,我想是的。正如梅森所概述的那样。
  • @StefanGlienke: I suppose you would know... ;)

标签: delphi orm devart


【解决方案1】:

I mentioned this in a blog post a few months ago.我没有查看源代码,但几乎可以肯定是这样做的:

  • 表达式Emp['Sal'] 返回一个record 类型的值
  • 此记录上声明了运算符重载
  • Delphi 语言将运算符重载定义为函数,并且不要求它们返回任何指定的或直观的类型。因此,这里的> 运算符不会返回布尔值,而是返回另一条记录。
  • 通过链接这些运算符,可以创建一个表达式树,它可以由它们的 LINQ 求值器求值。

【讨论】:

  • 感谢您的关注,我不知道 delphi 有这个功能。我一定会看得更远
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
相关资源
最近更新 更多