運算式樹 Expression tree 的使用

 

資料準備

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
USE [testDB]
GO
/****** Object: Table [dbo].[Score] Script Date: 2022/10/30 上午 10:51:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Score](
[StudentID] [int] NOT NULL,
[Class] [nvarchar](50) NOT NULL,
[TheScore] [int] NOT NULL
) ON [PRIMARY]
GO
/****** Object: Table [dbo].[Student] Script Date: 2022/10/30 上午 10:51:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Student](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Sex] [nvarchar](50) NULL,
[Age] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (1, N'國文', 100)
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (1, N'英文', 60)
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (2, N'國文', 50)
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (2, N'英文', 40)
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (3, N'國文', 60)
GO
INSERT [dbo].[Score] ([StudentID], [Class], [TheScore]) VALUES (3, N'英文', 80)
GO
INSERT [dbo].[Student] ([ID], [Name], [Sex], [Age]) VALUES (1, N'Bill', N'male', 25)
GO
INSERT [dbo].[Student] ([ID], [Name], [Sex], [Age]) VALUES (2, N'Mary', N'female', 30)
GO
INSERT [dbo].[Student] ([ID], [Name], [Sex], [Age]) VALUES (3, N'Tim', N'female', 30)
GO
INSERT [dbo].[Student] ([ID], [Name], [Sex], [Age]) VALUES (4, N'John', N'male', 28)
GO


一、使用運算式樹撈出年紀為 30 歲者

1
2
3
4
5
6
void Main()
{
Expression<Func<Student, bool>> ex = o => o.Age == 30;
var query = Students.Where(ex);
query.Dump();
}

結果如下圖


二、基本運算式樹範例

1
2
3
4
5
using System.Linq.Expressions;

Expression<Func<int, int>> exprTree = num => num * num;
Func<int, int> square = exprTree.Compile();
Console.WriteLine(square(3)); // output = 9


三、基本運算式樹範例

1
2
3
4
5
using System.Linq.Expressions;

Expression<Func<int, string>> squareExp = num => "輸出:" + (num * num);
Func<int, string> square = squareExp.Compile();
Console.WriteLine(square(3)); // 輸出:9