我是LINQ查询的新手。我已经阅读/研究了LINQ查询相对于SQL的所有优点,但我有一个基本问题,为什么我们需要使用这些查询,因为我觉得他们的语法比传统的SQL查询更复杂?
例如,请看下面的示例,了解简单的左外连接
var q=(from pd in dataContext.tblProducts
join od in dataContext.tblOrders on pd.ProductID equals od.ProductID into t
from rt in t.DefaultIfEmpty()
orderby pd.ProductID
select new
{
//To handle null values do type casting as int?(NULL int)
//since OrderID is defined NOT NULL in tblOrders
OrderID=(int?)rt.OrderID,
pd.ProductID,
pd.Name,
pd.UnitPrice,
//no need to check for null since it is defined NULL in database
rt.Quantity,
rt.Price,
})
.ToList();
答案 0 :(得分:2)
因此,LINQ(语言集成查询)的要点是提供在执行内存时使用可枚举集合的简单方法。与SQL对比,SQL是一种用于确定用户从数据库中的一组数据中获取的内容的语言。
由于类似SQL的语法,很容易将LINQ代码与SQL混淆,并认为它们“相似” - 它们实际上并非如此。 SQL从超集中获取数据的子集; LINQ是“语法糖”,隐藏了涉及foreach
循环的常见操作。
例如,这是一种常见的编程模式:
foreach(Thing thing in things)
{
if(thing.SomeProperty() == "Some Value")
return true;
}
......这在LINQ中很容易完成:
return things.Any(t => t.SomeProperty() == "Some Value");
这两个代码在功能上是相同的,我很确定甚至编译成大致相同的IL代码。不同之处在于它的外观。
您不必使用LINQ;您可以选择使用标准foreach
,有时候,例如复杂循环,这样做很有用。最后,这是一个可读性问题 - 我的反问题是,foreach
循环的LINQ版本是否比原始foreach
循环更可读或更少?
如果回答“较少”,我建议将其转换回foreach
。
答案 1 :(得分:1)
我绝不是sql或linq专家,我同时使用它们。
根据你的不同,有一种趋势要么将linq变成坏事,要么变成银子弹。
您需要认真考虑您的项目要求才能选择。选择并非相互排斥。从他们那里得到好处。
<强>优点强>
<强>缺点强>
我发现习惯使用Sql的程序员很难用LINQ搞清楚这些技巧。但是具有Sql知识但没有完成大量工作的程序员将更快地获得linq。
答案 2 :(得分:1)
人们开始使用LINQ时的主要问题是他们一直在思考SQL方式,他们首先设计SQL查询然后将其转换为LINQ。您需要学习如何以LINQ方式思考,并且您的LINQ查询将变得更整洁和简单。例如,在您的LINQ中,您不需要加入。您应该使用关联/导航属性。查看this post了解详情。