LINQ中比SQL更复杂的查询
本文关键字:查询 复杂 中比 SQL LINQ | 更新日期: 2023-09-27 17:57:51
我是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();
我绝不是sql或linq专家,我两者都用。
有一种趋势是,要么把林克变成坏人,要么变成银弹,这取决于你是哪一方。
为了做出选择,你需要认真考虑你的项目需求。这一选择并非相互排斥。从他们两个身上拿走好东西。
优点
- 快速转向发展
- 查询可以是动态的
- 表自动创建到类中
- 列会自动创建到属性中
- 关系自动出现在类中
- Lambda表达式太棒了
- 数据易于设置和使用
缺点
- 分层没有清晰的轮廓
- 没有查看权限的好方法
- 小数据集构建查询所需的时间比执行查询所需时间长
- 创建查询会产生开销
- 当查询从sql移动到应用程序端时,联接非常缓慢
- DBML并发问题
- 难以理解的使用表达式的高级查询
我发现,习惯了Sql的程序员将很难弄清楚使用LINQ的技巧。但是,有Sql知识但还没有做大量工作的程序员会更快地学会linq。
当人们开始使用LINQ时,主要问题是他们一直以SQL的方式思考,他们首先设计SQL查询,然后将其转换为LINQ。您需要学习如何以LINQ的方式进行思考,这样您的LINQ查询就会变得更整洁、更简单。例如,在LINQ中,您不需要联接。您应该使用关联/导航属性。查看此帖子了解更多详细信息。
因此,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
循环可读性更强还是更低?
如果答案是"less",那么我建议将其转换回foreach
。