查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。有两种方式可创建查询变量,示例如下:

// 方式一:查询语句语法
var q1 = from f in fruits where f.Length < 6 select f;
// 方式二:方法语法
var q2 = fruits.Where(f => f.Length < 6); // 可省略 select

Select 子句的作用是选择查询结果或投影。Select 子句生成查询结果并指定每个返回的元素的“形状”或类型。 例如,可以指定结果包含的是整个对象、仅一个成员、成员的子集,还是某个基于计算或新对象创建的完全不同的结果类型。当 Select 子句生成除源元素副本以外的内容时,该操作称为投影 。使用投影转换数据是 LINQ 查询表达式的一种强大功能。

 // 将查询结果投影到匿名类
var q3 = fruits.Where(f => f.Length < 6).Select((f, i) => new { i, f });// 投影到元祖
var q4 = fruits.Where(f => f.Length < 6).Select((f, i) => (Id: i, Name: f));
// 执行查询 q1
foreach (var q in q1)
	Debug.Log(q);
// 执行查询 q4
foreach (var q in q4)
	Debug.Log($"{q.Id} : {q.Name}");
匿名类和元组

上面的 q3,q4 用到了匿名类和元组进行投影,匿名类与元组是比 class 和 struct 类型更为简单灵活的数据容器。

// 匿名类的定义
// 方式一
var class1 = new { age = 20, name = "mango" };
// 方式二
int age = 21;
string name = "passionfruit";
var class2 = new { age, name };
// 元组的定义
// 方式一
var unnamed = ("one", "two"); // 未命名元组,使用 Item1,Item2 访问
// 方式二
var named = (first: "one", second: "two"); // 命名元组,使用名称访问

元组的一些其他用法:

// 赋值
public class Employee
    public string name;
    public int age;
	// 构造函数中,使用元组赋值	
    public Employee(string name, int age) => (this.name, this.age) = (name, age);
// 元组类型支持 == 和 != 运算符
	Employee e = new Employee("Joe", 20);
	// 使用元组进行判断
	if ((e.name, e.age) == ("Joe", 20))
		Debug.Log("equal");
                    定义数据源string[] fruits = { "apple", "banana", "mango", "orange",                      "passionfruit", "grape" };创建查询查询变量本身只存储查询命令。 查询的实际执行将推迟到在 foreach 语句中循环访问查询变量之后进行。// 查询语句语法var q1 = from f in...
				
Language-Integrated Query (LINQ) 定义了一组可以在 .NET Framework 3.0 编程语言中使用的通用标准查询运算符。 使用这些标准查询运算符可以投影、筛选和遍历内存中的集合或数据库中的表。 请注意,LINQ 查询使用编程 语言本身进行表示,而不表示为应用程序代码中嵌入的字符串。 这是在 .NET Framework 的早期版本中编写多数应用程序方式的重大更改。 使用编程语言中编写查询具有多项重要优势。 它可以简化查询,不必使用单独的查询语言。并且,如果您使用 Visual Studio 2008 IDE,LINQ 还允许您利用编译时检查、静态类型和 IntelliSense。
文章目录1.把集合中的每一项转换为另外一种类型2.匿名类型 1.把集合中的每一项转换为另外一种类型 IEnumerable<int> items = list.Select(it=>it.Age); foreach (var item in items) Console.WriteLine(item); IEnumerable<string> items = list.Where(it=>it.Salary>2500).Select(it=>
LINQ 查询简介TOC LINQ 通过提供处理各种数据源和数据格式的数据的一致模型,简化了这一情况。 在 LINQ 查询中,始终会用到对象。 可以使用相同的基本编码模式来查询和转换 XML 文档、SQL 数据库、ADO.NET 数据集、.NET 集合中的数据以及 LINQ 提供程序可用的任何其他格式的数据。 查询操作的三个部分 所有 LINQ 查询操作都由以下三个不同的操作组成: 获取数据源 创建查询 执行查询。 下面的示例演示如何用源代码表示查询操作的三个部分。 为方便起见,此示例将一个整数数组用作数
  投影是指在将序列中的元素转换为一个自定义形式的操作。投影操作符Select和SelectMany用于选择出赋予了适当功能的值。SelectMany操作符可以处理多个集合。   LINQ表达式语法: 1. Select   Select操作符对单个序列或集合中的值进行投影。 1.1 原型定义 public static IEnumerable&lt;TResult&g...
  投影操作,乍一看不知道在说啥。那么什么是投影操作呢?其实就是Select操作,名字起的怪怪的。和Linq查询表达式中的select操作是一样的。它能够选择数据源中的元素,并指定元素的表现形式。投影操作包括以下2种操作: 1、Select操作,将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。 2、SelectMany操作,也可以将数据源中的元素投影到新的序列中,并指定元素的类型...
// 使用LINQ查询语句查询数据 var query = from row in rows where row.Field<string>("Name") == "John" select new { Name = row.Field<string>("Name"), Age = row.Field<int>("Age") // 遍历查询结果 foreach (var item in query) { Console.WriteLine("Name: {}, Age: {1}", item.Name, item.Age); 在上面的代码中,我们首先将DataTable对象转换为IEnumerable<DataRow>类型,然后使用LINQ查询语句查询数据,最后将查询结果转换为一个匿名类型,包含Name和Age两个属性。最后,我们遍历查询结果,并输出每个人的姓名和年龄。