LINQ中比SQL更复杂的查询

时间:2014-04-11 12:48:01

标签: c# sql sql-server linq

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

3 个答案:

答案 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变成坏事,要么变成银子弹。

您需要认真考虑您的项目要求才能选择。选择并非相互排斥。从他们那里得到好处。

<强>优点

  • 快速转向发展
  • 查询可以动态
  • 表格会自动创建到班级
  • 列会自动创建为属性
  • 关系会自动附加到类
  • Lambda表达式非常棒
  • 数据易于设置和使用

<强>缺点

  • 没有清晰的Tiers大纲
  • 没有好的查看权限方式
  • 构建查询所需的小数据集需要比执行
  • 更长的时间
  • 创建查询的开销
  • 当查询从sql移动到应用程序端时,连接非常慢
  • DBML并发问题
  • 很难理解使用表达式的高级查询

我发现习惯使用Sql的程序员很难用LINQ搞清楚这些技巧。但是具有Sql知识但没有完成大量工作的程序员将更快地获得linq。

答案 2 :(得分:1)

人们开始使用LINQ时的主要问题是他们一直在思考SQL方式,他们首先设计SQL查询然后将其转换为LINQ。您需要学习如何以LINQ方式思考,并且您的LINQ查询将变得更整洁和简单。例如,在您的LINQ中,您不需要加入。您应该使用关联/导航属性。查看this post了解详情。