背景:下个月,我将在C#的背景下,就LINQ进行三次讨论,或者至少包括LINQ。我想知道哪些主题值得给予足够的关注,基于人们可能觉得难以理解的内容,或者他们可能对什么有错误的印象。我不会专门讨论LINQ到SQL或实体框架,除非作为如何使用表达式树(通常是IQueryable)远程执行查询的示例。
那么,你觉得LINQ有什么困难呢?你在误解方面看到了什么?示例可以是以下任何一种,但请不要限制自己!
- C#编译器如何处理查询表达式
- lambda表达式
- 表达式树
- 扩展方法
- 匿名类
- IQueryable
- 延期与立即执行
- 流式处理与缓冲执行(例如,orderby被延迟但被缓冲)
- 隐式类型的局部变量
- 读取复杂的通用签名(例如Enumerable.Join)
- 我很想知道你什么时候去做这些谈话,如果有什么方法可以在网上看到的话
- 第一次谈话:哥本哈根,10月30日。希望这会被录下来。(整整一天!)第二次谈话:伦敦,11月19日晚上,伦敦.net用户群,可能在推LINQ。第三个话题:阅读,11月22日,开发者日,在60分钟内实现linq-to-objects。
- 很酷,我想看看我能不能和DDD一天一起读书
- 投反对票者:请加上解释性评论。
- @乔恩,对不起,但我得把这个关了。
- @蒂姆:够公平的了——反正也没有得到更多的答案。我个人认为这最终是建设性的,提醒你-我当然觉得看看人们觉得什么是棘手的是有用的。不过我现在可能不会问…
- @乔恩-如果你愿意,我可以把它改成"太本地化了"。我有一个列举的清单要选,我选了一个我认为最合适的。我相信这个问题对其他人来说是有价值的,只是在你问这个问题将近三年后出现的堆栈溢出并没有讨论这个话题。
- 提姆:没错。可能值得迁移到程序员那里?这是关于程序员作为人…但同时也涉及到一项特定的技术,这使得它成为一项棘手的技术。老实说,我真的没那么挑剔。
- @乔恩,这有相当多的答案(一个被接受),它已经快三岁了,迁移到另一个站点并不是很有建设性。我不太确定如何根据这种经验改进系统。或者更确切地说,我无法表达任何建议的改进。
- @蒂姆:也许有人可以在meta上征求意见?还是直接去找杰夫?我不知道这有多普遍。
- @乔恩,我建议meta,这些都是需要解决的角落问题。记住,杰夫讨厌电子邮件。接触这样一个问题会让我们所有人(温和派)产生一种恐惧感,因此达成共识是非常有用的。
延迟执行
- 这显然是读者最喜欢的,这是这个问题最重要的。我还将在混合中添加"缓冲与流式处理",因为这是密切相关的-而且通常不会像我在书中希望看到的那样详细讨论。
- 真的?我在学习Linq的时候,多次向我指出它的懒惰和自然,这对我来说从来都不是问题。
- @Alassek,这真的取决于你从哪里学Linq。我为没有人知道的用户组做了一个懒惰的评估。
- 同意阿拉塞克。msdn文档清楚地说明了linq的惰性评估性质。可能真正的问题是开发人员的懒惰编程特性…=)
- …尤其是当您意识到它适用于对象的LINQ,而不仅仅是LINQ 2 SQL时-当您看到10个Web方法调用来检索项目列表时,您已经通过相同的项目列表枚举并且认为该列表已被评估
- 这应该是延期执行,对吗?安德斯在他关于林肯的视频中多次提到这一点。
- @埃利亚万,延迟或延迟的工作:)
- 了解收益率声明是什么以及它如何工作,对于全面了解Linq至关重要。
- 我的同事们说,即使被告知上百万次,或者在读了ABD的书之后,仍然没有得到LINQ的懒惰执行行为。
- 似乎有一种常见的误解,即IEnumerable是一个懒惰的列表,即只评估一次。
我知道到目前为止,延迟执行的概念应该已经打动我了,但这个例子确实帮助我实际掌握了它:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| static void Linq_Deferred_Execution_Demo ()
{
List <String> items = new List <string> {"Bob", "Alice", "Trent" };
var results = from s in items select s ;
Console .WriteLine("Before add:");
foreach (var result in results )
{
Console .WriteLine(result );
}
items .Add("Mallory");
//
// Enumerating the results again will return the new item, even
// though we did not re-assign the Linq expression to it!
//
Console .WriteLine("
After add:");
foreach (var result in results )
{
Console .WriteLine(result );
}
} |
上面的代码返回以下内容:
1 2 3 4 5 6 7 8 9 10
| Before add:
Bob
Alice
Trent
After add:
Bob
Alice
Trent
Mallory |
- 这是一个很好的例子!
- blogs.msdn.com/b/charlie/archive/2007/12/09/&hellip;<--我认为这是最好的博客来解释我的观点。(远至2007年,不敢相信它已经存在那么久了)
- 很好的例子,谢谢!
不仅有LINQ到SQL,而且功能不仅仅是嵌入在语言中的SQL解析器。
- 我讨厌每个人都这样想:/
- 不是每个人都这样!我仍然不知道linq to sql是什么,我一直在使用linq。
- 当我试图用LINQ解释一些事情时,我很生气,而另一个人只是看着我说:"哦,我不把LINQ用于任何类似的事情,只有SQL":。(
- 同意,许多人似乎不理解LINQ是一个通用工具。
大O符号。Linq使编写O(n^4)算法变得非常容易,如果你不知道自己在做什么,就不会意识到它。
- 有人能澄清这一点吗?
- 举个例子怎么样?
- 就一个例子而言,他可能是指这样一个事实:一个select子句很容易包含许多sum()运算符,其中每一个都会导致对整个记录集的另一个传递。
- 事实上,它甚至可能值得一看大O符号是什么,为什么它很重要,以及一些效率低下的查询示例。我想这就是最初的海报所暗示的,但我想我无论如何都会提到它。--编辑:刚刚意识到这篇文章是1.5岁的——)
- 那不是O(n^x),那是O(xn),它只是O(n)。
- 尝试在没有联接运算符的情况下进行联接将导致o(n^x):从范围1中的i1到范围2中的i2,从范围3中的i3到范围4中的i4,其中i1==i2&;&;i3==i4选择新的i1、i2、i3、i4。我以前也看过这本书。它起作用,但速度很慢。
我认为一个Lambda表达式可以同时解析表达式树和匿名委托,因此可以将同一个声明性Lambda表达式传递给IEnumerable扩展方法和IQueryable扩展方法。
- 同意。我是一个老手,当我开始编写自己的QueryProvider时,我才意识到这种隐式的演员阵容正在发生。
我花了很长时间才意识到许多LINQ扩展方法(如Single()、SingleOrDefault()等)都有需要lambda的重载。
你可以做到:
不用这么说-一些糟糕的指导让我养成了这样做的习惯
1
| Where(x => x.id == id).Single() |
- 1,非常好。我会记住的。
- 我也一直忘了这个。除其他外,Count()也是如此。除了代码可读性的明显优势之外,您知道是否还有性能差异吗?
- 在大学里,我的讲师想去掉使用这些超负荷的分数!!我证明他错了!
- 听起来可能很奇怪,但我更喜欢第二种语法。我觉得它更可读。
在LinqToSQL中,我经常看到人们不理解DataContext、如何使用它以及如何使用它。太多人看不到DataContext是什么,它是工作对象的一个单元,而不是持久对象。
我见过很多时候,人们试图单独使用一个数据上下文/会话it/etc,而不是为每个操作留出新的时间。
然后在对iqueryable进行评估之前处理DataContext,但这更像是一个不了解iqueryable的人的道具,而不是DataContext。
我看到的另一个概念是查询语法与表达式语法。在这一点上,我将使用最简单的方法,通常坚持表达式语法。很多人仍然不知道他们最终会产生相同的东西,毕竟查询是编译成表达式的。
- 警告:工作单元可以是一个小程序,数据上下文为单例。
- 不应在单实例中使用DataContext,它不是线程安全的。
- @slace,并不是所有的程序都是多头的,所以在许多"桌面"软件中把dataContext作为一个单头程序是可以的。
- 当我执行第一个LinqToSQL项目时,我被这个(使用DataContext作为单例)咬了一口。我认为文件和书籍并没有足够的证据表明这一点。事实上,我认为这个名字可以改进,但我不知道如何改进。
- 我花了好几次时间在Linq上阅读Scottgu的作品,才把它敲进我的脑袋。
我认为LINQ被误解的部分是它是一个语言扩展,而不是数据库扩展或构造。
LINQ比LINQ to SQL多得多。
既然我们中的大多数人已经在托收上使用了LINQ,我们就再也不会回去了!
LINQ是.NET最重要的特性,因为2.0中的泛型和3.0中的匿名类型。
现在我们有了lambda,我等不及要并行编程了!
- 我甚至称之为比匿名类型更重要,甚至可能比泛型更重要。
我个人肯定想知道我是否需要知道什么是表达树,为什么。
- 我认为知道表达树是什么以及它们为什么存在是值得的,但不知道如何自己构建它们的细节。(手工构建很困难,但是编译器在转换lambda表达式时会做得很好。)
- 实际上,我在考虑在表达式树上做一些博客条目(因为我会"得到"它们)。我发现操纵表达式树非常有用…
- 但是,我认为它们对乔恩的谈话没有帮助;-p
- 我需要简单地介绍一下,但您的日志肯定会受到欢迎的:)
- 我只是担心表达树会像产量声明一样:尽管我一开始不知道它是用来做什么的,但结果却是非常有价值的。
- 马克·格雷弗尔,我很想看看你关于这个问题的博客文章。期待着它
- 我添加了一个链接到这个链…
我最初没有意识到的是Linq语法不需要IEnumerable或IQueryable来工作,Linq只是模式匹配。
alt text http://barddesmet.info/images_wlw/qisiqueryabletherlightchoiceforme_13478/image_thumb_3.png
这是答案(不,我没有写那个博客,巴特·德斯密特写的,他是我在Linq找到的最好的博客之一)。
- 你可能会发现这篇博客文章也很有趣:msmvps.com/blogs/jonskeet/archive/2008/02/29/&hellip;
- 很好的文章乔恩(我订阅了你的博客,不过最近才订阅)。
我对林肯还比较陌生。这是我第一次尝试时遇到的问题
- 将多个查询合并为一个查询
- 在Visual Studio中有效地调试LINQ查询。
- 调试LINQ本身就是一个主题,也是一个重要的主题。我认为Linq最大的缺点是它可以让你编写任意复杂的逻辑块,而这是你无法单步完成的。
- 这可能是使用Linq Pad的好地方
- 衷心地同意;这就是我写Linq秘密的原因:链接和调试,刚刚在simple-talk.com上发布,您可能会找到帮助。
- 是的,LinqPad是在中开发Linq查询的一个很好的辅助工具。尤其是刚开始的时候,你还不熟悉惯例/模式。
了解LINQ提供者之间的抽象何时泄漏。有些东西对对象有效,但对SQL无效(例如takewhile)。有些方法可以转换成SQL(toupper),而其他方法则不能。有些技术在对象中更有效,而其他方法在SQL中更有效(不同的连接方法)。
- 这是一个很好的观点。IntelliSense将向您显示所有这些内容,它通常甚至会编译这些内容。然后在运行时爆炸。我希望Vs2010能更好地展示相关的扩展方法。
我仍然无法使用"let"命令(我从未找到该命令的用途)和selectmany(我使用过该命令,但我不确定是否正确)
- 任何时候只要你想引入一个变量,你就会使用一个let语句。想象一个传统的循环,在其中引入变量,并为每个变量命名,以帮助代码的可读性。有时,当您有一个let语句对函数结果进行评估时,这也是一个很好的方法,然后您可以选择并按on排序,而不必对结果进行两次评估。
- "let"允许您执行复合类型。方便的东西。
两件事。
人们认为Linq是Linq to SQL。
有些人认为,他们可以开始用LINQ查询替换所有foreach/logic,而不必考虑这种性能影响。
好吧,由于需要,我写了一些表达的东西。我对Blogger和LiveWriter密谋将其格式化并不完全满意,但现在就这样……
不管怎样,这是…我喜欢任何反馈,尤其是在有些地方人们需要更多的信息。
就在这里,喜欢还是讨厌…
有些错误消息,特别是从LINQ到SQL的错误消息可能非常令人困惑。露齿而笑
我和其他人一样,被延期执行的死刑咬了好几次。我认为对我来说最令人困惑的事情是SQL Server查询提供程序,以及您可以和不能用它做什么。
你不能在小数/货币列上做sum()这个事实仍然让我惊讶,因为它有时是空的。使用defaultifempty()只是不起作用。:(
- 在那个查询上加上一个"在哪里"就可以使sum工作了。
我认为在Linq中要介绍的一个很好的事情是如何让自己在性能方面陷入困境。例如,使用Linq的Count作为循环条件真的很不明智。
iqueryable接受这两种情况,即Expression>和Func,但没有给出第二种情况下性能下降的提示。
下面是代码示例,它演示了我的意思:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [TestMethod]
public void QueryComplexityTest()
{
var users = _dataContext.Users;
Func<User, bool> funcSelector = q => q.UserName.StartsWith("Test");
Expression<Func<User, bool>> expressionSelector = q => q.UserName.StartsWith("Test");
// Returns IEnumerable, and do filtering of data on client-side
IQueryable<User> func = users.Where(funcSelector).AsQueryable();
// Returns IQuerible and do filtering of data on server side
// SELECT ... FROM [dbo].[User] AS [t0] WHERE [t0].[user_name] LIKE @p0
IQueryable<User> exp = users.Where(expressionSelector);
} |
- 你能解释一下吗?我不跟踪…
- @pretzel我添加了代码示例,演示了我的问题。
- 感谢您提供代码示例!非常有帮助。
我不知道这是否属于被误解——但对我来说,完全不知道。
我很高兴地了解了DataLoadOptions,以及在进行特定查询时如何控制哪些表被联接。
有关详细信息,请参阅此处:msdn:dataloadOptions
正如大多数人所说,我认为最被误解的部分是假设Linq只是T-SQL的替代品。我的经理认为自己是TSQL专家,他不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!!!!
- 太多人使用它来代替TSQL。他们中的大多数人从未听说过执行计划。
- +1因为我同意您的经理,至少在允许Linq在任何项目中使用SQL的情况下是这样。对对象的Linq完全是另一回事。
我想说的是最被误解的(还是不被理解的?)LINQ的方面是可查询的和自定义的LINQ提供者。
我用LINQ已经有一段时间了,在IEnumerable的世界里非常舒服,可以解决大多数LINQ的问题。
但是当我开始查看和阅读关于iqueryable、表达式和定制Linq提供者的内容时,它让我头晕目眩。如果您希望看到一些非常复杂的逻辑,请看一下LinqToSQL是如何工作的。
我期待着了解Linq的这一方面…
执行查询时var代表什么?
是iQueryable、iSingleResult、iMultipleResult,还是根据执行情况而改变。有一些关于使用(看起来是)动态类型和C中的标准静态类型的推测。
- afaik var始终是有问题的具体类(即使它是匿名类型),因此它永远不可查询、isingresult或以"i"开头的任何内容(以"i"开头的具体类不需要应用)。
我认为每个人都不理解嵌套一个循环是多么容易。
例如:
1 2 3
| from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem |
已编译查询
您不能链接IQueryable,因为它们是方法调用(尽管除了SQL可翻译之外,其他什么都没有!)几乎不可能围绕它工作,这是令人难以置信的,并造成了对干燥的巨大破坏。我需要我的IQueryable用于没有编译查询的即席查询(我只编译用于重场景的查询),但是在编译的查询中,我不能使用它们,而是需要重新编写常规查询语法。现在,我在两个地方执行相同的子查询,需要记住,如果发生变化,需要同时更新这两个查询,等等。噩梦
group by仍然使我的头旋转。
任何关于延迟执行的混淆都应该能够通过单步执行一些简单的基于LINQ的代码并在监视窗口中四处播放来解决。
- 我发现实现相当多的linq-to-objects是很有帮助的:)但是,是的,这有点令人困惑-当然,如果我有一段时间没有做任何linq,我必须回到签名。同样,"加入"和"加入"经常让我…
我认为关于Linq to SQL的1误解是,为了有效地利用它,您仍然需要了解SQL。
关于LinqToSQL的另一个误解是,为了使其正常工作,您仍然需要将数据库安全性降低到荒谬的程度。
第三点是,使用LINQ to SQL和动态类(意味着类定义是在运行时创建的)会导致大量的实时编译。这绝对会扼杀性能。
- 不过,了解SQL是非常有益的。LinqToSQL(和其他ORM)发出的一些SQL可能是完全可疑的,了解SQL有助于诊断此类问题。此外,Linq to SQL可以利用存储过程。
延迟加载。
- 类似于stackoverflow.com/questions/215548/&hellip;
事务(不使用TransactionScope)
如前所述,延迟加载和延迟执行
Linq to对象和Linq to XML(IEnumerable)与Linq to SQL(IQueryable)的区别
如何在所有层中使用LINQ构建数据访问层、业务层和表示层……这是一个很好的例子。
- 我能做到的前两个。我还不想尝试用一种"这是正确的方法"的感觉来做第三件事…
- +1,直到您指出它,我还没有意识到linq to对象和linq to xml是IEnumerable,而linq to sql是iqueryable,但这是有意义的。谢谢!
正如大多数人所说,我认为最被误解的部分是假设Linq只是T-SQL的替代品。我的经理认为自己是TSQL专家,他不会让我们在项目中使用LINQ,甚至讨厌MS发布这样的东西!!!!
解释为什么Linq不像SQL语法那样简单地处理左外部联接。请参阅本文:使用LINQ实现左联接,如何:执行左外部联接(C编程指南)当我遇到这个障碍时,我非常失望,以至于我对语言的所有尊重都消失了,我觉得这只是一种很快就会消失的东西。没有一个严肃的人愿意使用缺乏这些战场证明的原始语的语法。如果您可以解释为什么不支持这些类型的设置操作。我会成为一个更好更开明的人。
- 有趣。到目前为止,我还没有找到一个需要左外部加入林肯。您能提供这样的情况吗?在这种情况下,这将是最好的选择,并且它将如何有利于查询的执行?
- 在对象关系映射(Linq就是这样做的)上下文中,左外部联接没有意义。对象不应在其所有字段都设置为空时进行水合!
- 但在那个时候,每个人都说Linq现在应该完全取代SQL。只有顽固的老人才会使用SQL和存储过程。我正在建立一个网站,在那里经济部门的人匹配(重新调整)外部发票与内部会计。我们收到了一张为项目工作的分包商开的发票。分包商名称匹配,活动与客户端数学匹配,但项目代码不匹配。必须做点什么。猜猜谁是项目负责人,联系他们,联系分包商ETD。所以这是一个左连接al-lot应用程序。
- 我喜欢你在这里加入左联,我不想双重发帖。你对林肯的解雇是很严厉的。我也希望看到left join作为一个操作符或其他东西,但我仍然一直使用linq。彻底改变了旧的方式。
- 我现在更加开明,使用LINQ。我甚至尝试只在日常的临时数据库查询中使用linqpad。但现在是林克的分组让我困惑。(见richardbushnell.net/2008/02/08/&hellip;)就像现在我得到了它,不,我不知道。
我觉得"创造表情树"很难。有很多事情困扰着我w.r.t你可以用linq,linq to sql和ado.net。
Linq to SQL如何翻译它!
假设我们有一个表,其中有3个字段:a、b&c(它们是整数,表名是"table1")。
我是这样展示的:
[a,b,c]
现在我们想得到一些结果,例如:
[X=A,Y=B+C]
我们有这样一个班级:
1 2 3 4 5 6 7 8 9 10 11
| public class Temp
{
public Temp(int x, int y)
{
this.X = x;
this.Y = y;
}
public int X { get; private set; }
public int Y { get; private set; }
} |
然后我们这样使用它:
1 2 3 4 5
| using (MyDataContext db = new MyDataContext ())
{
var result = db .Table1.Select(row =>
new Temp (row .A, row .B + row .C)).ToList();
} |
生成的SQL查询是:
1 2
| SELECT [t0].[A] AS [x], [t0].[B] + [t0].[C] AS [y]
FROM [Table1] AS [t0] |
它转换温度的系数。它知道我想要"row.b+row.c"(甚至更多…)放在类构造函数的"y"参数上!
这些翻译对我很不感兴趣。我喜欢这样,我认为写这样的翻译(Linq to something)有点难!
当然!这是一个坏消息:LINQtoEntities(4.0)不支持带有参数的构造函数。(为什么不呢?)
- 是的,我真的很怀念Linq to Entities中的这个功能…
我认为您应该更详细地关注linq最常用的特性——lambda表达式和匿名类型,而不是浪费时间在"难以理解"的东西上,这些东西在现实世界的程序中很少使用。
- 我同意这一原则,但实际上,几乎所有难以理解的比特都经常用于现实世界中的程序——只是人们没有真正理解它们。
哪个更快,使用tsql存储过程内联linq to sql或linq to sql
…在某些情况下,使用服务器端(存储过程)或客户端(内联LINQ)查询更好。
理解语法"magic"。如何将理解语法转换为方法调用以及选择了什么方法调用。
例如,如何:
1 2 3 4
| from a in b
from c in d
where a > c
select new { a, c } |
转换为方法调用。
- 我在演讲中做了一些这样的工作,但主要是"这是编译器所做的事情"——包括"它不知道翻译将调用扩展方法等"。当然,细节相当复杂……
- (不过,我确实在透明标识符上做了一些介绍,这与您的示例相关。)
- 如果我尝试重新考虑它作为一个方法链,我总是发现它更容易理解:b.selectmany(a=>d,(a,c)=>new a=a,c=c)。where(thing=>thing.a>thing.c)。select(otherthing=>new a=otherthing.a,c=otherthing.c)
对于Linq2SQL:了解一些生成的SQL,并编写转换为良好(快速)SQL的Linq查询。这是更大的问题的一部分,即知道如何平衡LINQ查询的声明性性质与它们需要在已知环境(SQL Server)中快速执行的现实性。
通过更改LINQ代码中的一个小东西,您可以得到一个完全不同的SQL生成的查询。如果要基于条件语句(即添加可选筛选条件)创建表达式树,则可能会特别危险。
我发现查询表达式语法只支持LINQ功能的一个子集有点令人失望,因此您不能避免不时地链接扩展方法。例如,不能使用查询表达式语法调用Distinct方法。要使用Distinct方法,需要调用扩展方法。另一方面,查询表达式语法在许多情况下非常方便,因此您也不想跳过它。
一个关于LINQ的讨论可以包括一些实用的指导原则,说明何时喜欢一种语法而不是另一种,以及如何混合它们。
- 我个人很高兴查询表达式语法不包含很多运算符。当您需要使用点符号时,点符号是很好的,并且这种平衡使C仍然是一种相当小的语言。规范的查询表达式部分既好又短——我不希望有很长的部分。
当然,这不是"最困难的",而是要添加到列表中的内容:
1
| ThenBy() extension method |
不看它的实现,我最初对它是如何工作感到困惑。每个人都很清楚逗号分隔的排序字段在SQL中是如何工作的——但就表面价值而言,我怀疑Thenby是否会做我真正希望它做的事情。它怎么能"知道"前一个排序字段是什么——看起来它应该是。
我现在要去研究它…
- 诀窍是Thenby是iorderenumerable(或iorderedqueryable)上的扩展方法,而不仅仅是ienumerable/iqueryable。你可以下载我的(非常天真!)从我的对话页面实现:csharpindepth.com/talks.aspx-请参阅"60分钟内到对象的linq"
我发现很难找到关于匿名类型的明确信息,特别是关于Web应用程序的性能。此外,我还将在查询和性能相关主题中建议更好和实用的lamda表达式示例和"如何"部分。
希望我的简要清单能有所帮助!
您不能链接iQueryable,因为它们是方法调用(但除了SQL可翻译之外,其他什么都没有!)几乎不可能围绕它工作,这是令人难以置信的,并造成了对干燥的巨大破坏。我需要我的iqueryable用于没有编译查询的即席查询(我只有针对重场景编译的查询),但是在编译的查询中,我不能使用它们,而是需要再次编写常规查询语法。现在,我在两个地方执行相同的子查询,需要记住,如果发生变化,需要同时更新这两个查询,等等。噩梦
我打赌几乎有人知道:您可以在LINQ查询中使用内联IFS。像这样:
1 2 3 4
| var result = from foo in bars where (
((foo.baz != null) ? foo.baz : false) &&
foo.blah =="this")
select foo; |
我想你也可以插羊羔肉,尽管我没有试过。
- 这只是一个条件表达式-为什么你不能使用它?
- 我有一种(可能是错的)印象,那就像一个普通的if:你现在不会看到任何像这样的普通if的嵌入,是吗?或者我可能错了…
- if是语句,条件运算符是表达式。它们是同一分支概念的不同形式。在这种情况下,你可以做"foo.baz"??false",并使用空合并运算符-)
- 我认为认识三元运算符的人比认识相反的人要多。
- 产生布尔值的条件表达式可以简化为布尔或/和表达式,因此(foo.baz != null) ? foo.baz : false相当于(foo.baz != null) && foo.baz。我认为这可以应用于任何可以作为where条件传递的三元表达式。所以这并不奇怪,imho