背景:在接下来的一个月里,我将做三次关于LINQ的演讲,或者至少将LINQ包含在c#的上下文中。我想知道哪些话题值得花相当多的精力,这取决于人们可能很难理解哪些话题,或者他们可能有错误的印象。我不会具体讨论LINQ to SQL或实体框架,只是作为如何使用表达式树(通常是IQueryable)远程执行查询的示例。

那么,你发现LINQ有什么难的地方吗?在误解方面你看到了什么?例子可能是以下任何一个,但请不要限制自己!

c#编译器如何处理查询表达式 Lambda表达式 表达式树 扩展方法 匿名类型 这个IQueryable 延迟执行与立即执行 流与缓冲执行(例如,OrderBy被延迟但被缓冲) 隐式类型局部变量 读取复杂的泛型签名(例如Enumerable.Join)


当前回答

正如大多数人所说,我认为最被误解的部分是假设LINQ只是T-SQL的替代品。我的经理认为自己是一个TSQL专家,他不让我们在项目中使用LINQ,甚至讨厌微软发布这样的东西!!

其他回答

一些错误消息,特别是从LINQ到SQL的错误消息可能非常令人困惑。露齿而笑

和其他人一样,我也被推迟执行的问题困扰过几次。我认为对我来说最困惑的事情是SQL Server查询提供程序,以及你能用它做什么和不能做什么。

我仍然惊讶于你不能在有时为空的小数/货币列上执行Sum()。使用DefaultIfEmpty()是行不通的。:(

我打赌几乎有人知道:你可以在linq查询中使用内联if。就像这样:

var result = from foo in bars where (
    ((foo.baz != null) ? foo.baz : false) &&
    foo.blah == "this")
    select foo;

我猜你也可以插入,尽管我还没试过。

我对LINQ还是个新手。以下是我第一次尝试时遇到的问题

将多个查询合并为一个查询 在Visual Studio中有效地调试LINQ查询。

我认为关于LINQ to SQL的第一个误解是,你仍然必须了解SQL才能有效地使用它。

关于Linq to Sql的另一个误解是,为了让它工作,你仍然必须降低数据库的安全性到荒谬的地步。

第三点是将Linq to Sql与动态类一起使用(意味着类定义是在运行时创建的)会导致大量的即时编译。这绝对会破坏性能。

执行查询时var代表什么?

它是iQueryable, iSingleResult, iMultipleResult,还是根据实现改变。在c#中使用(似乎是)动态类型与标准静态类型之间存在一些猜测。