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(); 

LINQ中比SQL更复杂的查询

我绝不是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