背景:在接下来的一个月里,我将进行三次谈话,或者至少包括LINQ在上下文中C#.我想知道哪些主题值得给予相当多的关注,基于人们可能会发现难以理解的内容,或者他们可能会错误地认为什么.我不会特别谈论LINQ到SQL或实体框架除了作为如何查询可以远程使用表达式树(通常被执行的例子IQueryable).
那么,你发现了LINQ什么?你在误解方面看到了什么?示例可能是以下任何一种,但请不要限制自己!
C#编译器如何处理查询表达式IQueryableJar*_*Par 271
延迟执行
DSO*_*DSO 125
我知道延迟执行概念现在应该被打败,但是这个例子确实帮助我实际掌握了它:
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("\nAfter add:");
foreach (var result in results)
{
Console.WriteLine(result);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码返回以下内容:
Before add:
Bob
Alice
Trent
After add:
Bob
Alice
Trent
Mallory
Run Code Online (Sandbox Code Playgroud)
sma*_*ell 104
这不仅仅是LINQ为了SQL而且这些功能不仅仅是SQL嵌入在语言中的解析器.
eri*_*len 86
大O符号.如果您不知道自己在做什么,LINQ可以非常容易地编写O(n ^ 4)算法,而无需实现它.
Tim*_*vis 55
我认为Lambda表达式可以解析为表达式树和匿名委托这一事实,因此您可以将相同的声明性lambda表达式传递给IEnumerable<T>扩展方法和IQueryable<T>扩展方法.
Sim*_*ver 53
把我的方式很长时间才意识到,很多LINQ扩展方法,如Single(),SingleOrDefault()等有需要lambda表达式重载.
你可以做 :
Single(x => x.id == id)
Run Code Online (Sandbox Code Playgroud)
并且不需要这样说 - 一些糟糕的教程让我养成了做的习惯
Where(x => x.id == id).Single()
Run Code Online (Sandbox Code Playgroud)
Aar*_*ell 40
在LINQ to SQL中,我经常看到人们不了解DataContext,如何使用它以及如何使用它.太多人没有看到DataContext是什么,一个工作单元对象,而不是持久对象.
我已经看过很多次人们试图单独使用DataContext/session会话而不是为每个操作创造新的时间.
然后在评估IQueryable之前就已经处理了DataContext,但更多的是人们不了解IQueryable而不是DataContext.
我看到很多混淆的另一个概念是查询语法与表达式语法.我将使用哪个是最容易的,通常坚持使用表达式语法.很多人还没有意识到他们最终会产生同样的东西,毕竟Query被编译成Expression.
Chr*_*ris 34
我想在 LINQ的误解的部分是,它是一种语言的扩展,而不是一个数据库扩展或构建.
LINQ不仅仅是LINQ to SQL.
既然我们大多数人都使用LINQ过收藏品,我们永远不会回去!
LINQ 自从2.0中的Generics和3.0中的匿名类型以来,.NET是.NET最重要的特性.
现在我们有了Lambda,我不能等待并行编程!
Rob*_*ney 26
我肯定想知道我是否需要知道树的表达方式,以及为什么.
Mar*_*ath 20
我是LINQ的新手.这是我第一次尝试时偶然发现的事情
Aar*_*ell 20
我最初没有意识到的是,在LINQ语法的东西并不需要IEnumerable<T>或IQueryable<T>工作,LINQ是只是模式匹配.
alt text http://bartdesmet.info/images_wlw/QIsIQueryabletheRightChoiceforMe_13478/image_thumb_3.png
这是答案(不,我没有写那篇博客,Bart De Smet做过,而且他是我发现的LINQ上最好的博客之一).
Jam*_*ran 19
我仍然遇到"let"命令(我从来没有找到用途)和SelectMany(我已经使用过,但我不确定我做得对)的问题
den*_*ips 19
了解Linq提供程序中的抽象何时泄漏.有些东西可以处理对象而不是SQL(例如.TakeWhile).有些方法可以转换为SQL(ToUpper)而其他方法则不能.某些技术在其他人在SQL中更有效的对象(不同的连接方法)中更有效.
Per*_*ahl 10
一些错误消息,尤其是从LINQ到SQL的错误消息可能会令人困惑.微笑
我和其他人一样被延迟执行了几次.我认为对我来说最令人困惑的是SQL Server查询提供程序以及您可以做什么和不能用它做什么.
我仍然对你不能在有时为空的小数/金钱列上做Sum()这一事实感到惊讶.使用DefaultIfEmpty()只是行不通.:(
IQueryable接受了两者,Expression<Func<T1, T2, T3, ...>>并且Func<T1, T2, T3, ...>没有在第二种情况下提示性能下降.
这是代码示例,演示了我的意思:
[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);
}
Run Code Online (Sandbox Code Playgroud)
我不知道它是否有资格被误解 - 但对我而言,仅仅是未知数.
我很高兴了解DataLoadOptions以及在进行特定查询时如何控制哪些表连接.
有关详细信息,请参阅此处:MSDN:DataLoadOptions
我会说LINQ中最容易被误解的(或者应该是不可理解的?)方面是IQueryable和自定义LINQ提供程序.
我已经使用LINQ了一段时间,并且在IEnumerable世界中完全感到舒服,并且可以解决LINQ的大多数问题.
但是当我开始关注IQueryable,以及Expressions和自定义linq提供程序时,它让我头晕目眩.如果你想看到一些非常复杂的逻辑,看看LINQ to SQL是如何工作的.
我期待理解LINQ的那个方面......
小智 5
var在执行查询时表示什么?
难道iQueryable,iSingleResult,iMultipleResult,或者它改变基础上实施.关于使用(似乎是什么)动态类型与C#中的标准静态类型有一些猜测.
嵌套循环是多么容易,我不认为每个人都理解.
例如:
from outerloopitem in outerloopitems
from innerloopitem in outerloopitem.childitems
select outerloopitem, innerloopitem
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48874 次 |
| 最近记录: |