linq 整理(前序)
前言
对linq进行整理,分为前序、中序和后序。
前序就是一些简单的概念和模拟。
中序的话就是深挖一些思想。
后序对其进行解刨。
正文
语言集成查询 (LINQ) 是一系列直接将查询功能集成到 C# 语言的技术统称。 数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。 此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。
这样看,似乎有点难以理解。
回过头来,这样想下。什么能使用linq,那么就需要实现linq的规则。如果没有,那么适配也可以实现。
告诉我们,要实现select,那么我们就给他实现呗。
然后我实现了这个:
class txt
{
public txt Select(Func<int, txt> selector)
{
return new txt();
}
}
然后调用:
txt a = new txt();
var scoreQuery =
from score in a
select score;
Console.WriteLine(scoreQuery);
可以调用出来啊。
那么:
范围变量和数据源都是强类型。from 子句中引用的数据源的类型必须为 IEnumerable、IEnumerable<(Of <(T>)>) 或一种派生类型(如 IQueryable<(Of <(T>)>))。
就不完全正确。可以实现自己的一套机制。
再举个栗子:
调用:
txt a = new txt();
var scoreQuery =
from score in a
select score[0];
Console.WriteLine(scoreQuery);
解析:
如果上面没解释好,那么下面就是详细解析了。
from score in a 是什么意思呢?
是调用a中的select,将会传入一个score。
所以这个score 是我们调用selector invoke 传入的值。
那么这个委托:
就是:
返回过来,selector就是:
function x(List<txt> y){
return y[0];
}
然后返回的值,就是select 返回的值。
其他的where 也一样。
最后为了深刻理解,那我来写一个模拟例子:
class txt
{
public string Name { get; set; }
public int Value { get; set; }
public txt next { get; set; }
public List<T> Select<T>(Func<txt,T> selector)
{
List<T> lst = new List<T>();
txt temp = this;
while(temp!=null)
{
lst.Add(selector.Invoke(this));
}
return lst;
}
}
调用:
txt a = new txt();
a.Name = "a";
a.Value = 1;
txt b = new txt();
b.Name = "b";
b.Value = 2;
var scoreQuery =
from score in a
select score.Name;
Console.WriteLine(scoreQuery);
然后最后埋一个影子:
查询表达式可被编译成表达式树或委托,具体视应用查询的类型而定。 IEnumerable<T> 查询编译为委托。 IQueryable 和 IQueryable<T> 查询编译为表达式树。