C# 中的查询和方法语法转换

发布日期:2026-07-14 01:56:03   来源 : 杭州电子商务研究院    浏览量 :11
杭州电子商务研究院 发布日期:2026-07-14 01:56:03  
11

介绍

LINQ是“语言集成查询”的缩写,它基本上是一组技术。微软的想法是将查询功能直接集成到 C# 语言中。对于这些类型的查询,您需要了解不同的查询语言才能使用 SQL 数据库、XML 或各种 Web 服务,而传统查询则以简单字符串表示并由引擎解释。

在本指南中,我们将首先通过一个示例阐明什么是 LINQ,然后演示查询方法语法之间的区别。

LINQ

让我们创建一个小演示,使用 LINQ 来筛选高于指定值的彩票号码。

      using System;
using System.Linq;
using System.Collections.Generic;

namespace Pluralsight
{
    public class Linqing
    {
        
        public static void Main()
        {
            int[] lottery = new int[] { 11,22,33,44,55,66};

            IEnumerable<int> lotteryQuery =
                from lot in lottery
                where lot > 20
                select lot;

            foreach (int i in lotteryQuery)
            {
                Console.Write(i + " ");
            }
            Console.ReadKey();
        }
    }
}
    

输出如下。

      22 33 44 55 66
    

这里的核心是 LINQ 查询,它与我们大多数人喜欢编写的SQL查询非常相似。 where子句定义了我们感兴趣的上述过滤器。然后foreach允许我们获取过滤器中捕获的值。

      from lot in lottery
where lot > 20
select lot;
    

查询和方法语法在语义上是相同的,但包括我在内的大多数开发人员都发现查询语法更易于阅读和排除故障。查询运算符的参考文档可在此处找到。我们可以说这两种方法只是用于同一工作的不同工具。在幕后,编译器始终将查询语法转换为方法语法,因为它需要函数调用。

我们可以通过这种方式将查询语法转换为方法语法。

      IEnumerable<int> lotteryQuery = lottery.Where(num => num > 20);
    

在 for 循环中迭代结果会产生相同的结果。如果我们检查输出变量的类型,就会发现它是IEnumerable<T>类的一个实例。

方法或查询语法的一般经验规则是:

  1. 指定从哪里进行选择
  2. 必要时进行过滤
  3. 有需要的话可以下单
  4. 捕获结果

使用方法语法,我们可以实现如下函数:

  1. 选择()
  2. 在哪里()
  3. OrdertBy()
  4. ETC。

Let 关键字

let关键字是基于查询的语法的一个非常了不起的功能。简单来说,它允许您存储结果以供以后在查询中使用。让我们来看一个演示。假设我们有一个服务器园区,其中包括服务器的名称、类型和正常运行时间。我们想要查询正常运行时间超过 2 年的服务器。

在查询语法中,它看起来像这样。

      var MS =
    from server in servers
    let age = GetUptime(server)
    where age > 2
    orderby age
    select server.Name;
    

在方法语法中,我们可以做类似这样的事情。

      var QS = servers
    .Select(server => new { 
      age = GetYearsWorking(server), Name = server.Name })
    .Where(x => x.age > 4)
    .OrderBy(x => x.age)
    .Select(x => x.Name);
    

在这种情况下,方法语法使得揭示其意图变得更加困难,并且在进行故障排除时它并不理想。

多个来源

可能存在这样的情况:您有两个不同的数据源,并且您希望将序列的每个元素投影到IEnumerable<T>

      var ids = Enumerable.Range(1, 10); //1,2,3
var names = new string[] { "DC", "DNS", "DHCP", "APP", "ISM", "FND", "SQL", ""};
 
var QS = from id in ids
               from name in names
               select $"map [{id}, {name}]";
 
var MS = 
    rows.SelectMany(id => names, (i, n) => $"cell [{i}, {n}]");
    

迭代数据结构,将显示以下输出。

      cell [1, DC]
cell [1, DNS]
cell [1, DHCP]
cell [1, APP]
cell [1, ISM]
cell [1, FND]
cell [1, SQL]
cell [1, ]
cell [2, DC]
...
    

查询语法很容易理解,而方法语法却使方程式变得令人费解。

有一个有趣的 github 存储库,其中有一个用于在这两种语法之间进行转换的工具,您可以在这里查看。

结论

在本指南中,我们了解了 LINQ 中的查询和方法语法方法。我们还了解到,无论我们使用哪种方法,查询语法都会在后台转换为方法语法。我希望本指南对您有所帮助,并感谢您阅读它!

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据