我想知道以下是什么类型的.NET查询语言:
tableName.Select(e => e.PartitionKey == „KeyX“).ToList().OrderBy(e => e.SomeValue).Take(25)
我发现它是查询Windows Azure存储表的示例。
这个东西是一个名字,它是否也可以用于SQL而不是Azure存储表,是否包含在.NET或一些额外的库中?
谢谢
答案 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)