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> 查询编译为表达式树。
posted @ 2020-09-27 23:58  敖毛毛  阅读(403)  评论(0编辑  收藏  举报