这是什么类型的.NET查询语言?

时间:2012-02-24 23:10:27

标签: .net sql azure azure-table-storage

我想知道以下是什么类型的.NET查询语言:

tableName.Select(e => e.PartitionKey == „KeyX“).ToList().OrderBy(e => e.SomeValue).Take(25)

我发现它是查询Windows Azure存储表的示例。

这个东西是一个名字,它是否也可以用于SQL而不是Azure存储表,是否包含在.NET或一些额外的库中?

谢谢

2 个答案:

答案 0 :(得分:5)

这是LINQ,虽然我认为您的查询轻微搞砸了。这是一个很大的话题,但非常重要。有不同的LINQ实现可以处理进程内集合,SQL,适当的类似REST的Web服务等。

请注意,也有直接的语言支持:

// Wouldn't work in this particular case - see below
var query = (from e in tableName
             where e.PartitionKey == "KeyX"
             orderby e.SomeValue
             select e).Take(25);

请注意,问题中查询中的ToList()会强制立即执行Azure部分,并将结果作为List<T>提取给客户端。它可以然后在客户端上进行排序和限制。我通常会使用AsEnumerable()代替它(强制查询的其余部分在LINQ to Objects中完成,但不会立即实现List),但ToList是另一个选项。

答案 1 :(得分:2)

.Select(…).ToList().OrderBy(…).Take(…)LINQ query operators

它们是作为IEnumerable<T>IQueryable<T>类型的扩展方法实现的。对于前者,他们居住在静态System.Linq.Enumerable class;对于后者,它们在System.Linq.Queryable class中定义。因为这些方法返回的类型与他们正在操作的方法相同,所以它们允许方法链接:.Select(…).ToList().OrderBy(…).Take(…)


简而言之,

LINQ 是.NET 3.5中引入的声明性API(在函数式编程中有很强的根源)。它的主要目的是查询所有类型的序列和集合:内存中对象集合,XML文档,SQL数据库,网络数据源等。通过对C#和VB.NET语言的几种扩展使其成为可能,其中包括: / p>

  • 扩展方法,例如:

    static class Enumerable
    {
        public static bool IsEmpty<T>(this IEnumerable<T> xs)
        {                          // ^^^^
            foreach (T x in xs)
            {
                return false;
            }
            return true;
        }
    }
    

    这使得写作成为可能:

    // List<int> numbers = …;
    numbers.IsEmpty()
    

    而不是

    Enumerable.IsEmpty(numbers)
    
  • 改进的类型推断

  • 匿名委托(lambda函数)的新的,更紧凑的=>语法。

    delegate (int x, int y) { return x == y; }  // only this was valid in C# 2
          (int x, int y) => { return x == y; } 
          (int x, int y) => x == y; 
    
    (int x) => x > 0 
          x => x > 0 
    
  • 表达式和表达式树(即编译器可以将源代码输出为AST数据结构而不是CIL“字节码”;请参阅System.Linq.Expressions命名空间)

  • 语法转换/查询理解语法:

    from x in xs where W select S
    

    变为

    xs.Where(x => W).Select(x => S)
    

    反过来变成:

    // using System.Linq
    Enumerable.Select(Enumerable.Where(xs, x => W), x => S)