https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/let-clause

一、定义

Linq(Language Integrated Query)语言集成查询

c#或vb编程语言用相同的语法直接查询各种数据源(数据库、xml文档、ADO.NET 数据集、支持 IEnumerable 或泛型 IEnumerable<T> 接口的任意对象集合)

LINQ 需要framework 3.0以上才能使用

查询表达式语法:    -----还有流式语法,后面补充

类型 查询变量 = from 临时变量 in 集合对象或数据库对象
    [where 条件表达式]
    [order by 条件]
    select 临时变量中被查询的值
    [group by 条件]

查询变量:保存的是查询的第一页

临时变量:集合中的一个对象

集合对象或数据库对象:整个集合

临时变量中被查询的值:查询的结果值

临时变量的类型是由之前定义得到了,查询变量的类型是由select 查询的类型决定的。可以用var自行推断类型

二、运算符用法

https://msdn.microsoft.com/zh-cn/library/bb397896(v=vs.110).aspx

使用查询表达式

1.


            int[] arr1 = { , ,  };
int[] arr2 = { , , };
Console.WriteLine("-------------遍历计算---------------------------");
//
//var n1 = from q in arr1 select q*2;
//foreach (var a in n1)
//{
// //Console.WriteLine(a.ToString());
//}
Console.WriteLine("-----------相当于两层嵌套遍历-----------------------------");
//var n2 = from q in arr1
// from p in arr2 select q*p;
//foreach (var a in n2)
//{
// Console.WriteLine(a.ToString());
//}
//Console.WriteLine(t.ToString());
Console.WriteLine("---------------匿名初始化-------------------------");
//
//var n = from q in arr1 select new { ID = q, Name = q.ToString() };
//foreach (var a in n)
//{
// Console.WriteLine($"ID={a.ID},Name={a.Name}");
//}
Console.WriteLine("-------------按条件查询--------------------------");
//var a = from n in arr1 where n > 2 && n<4 select n;
//foreach (var o in a)
//{
// Console.WriteLine(o);
//}
Console.WriteLine("-------------where条件可以是个函数,函数返回bool值 true的保留--------------------------");
//var a = from n in arr1 where fun(n) select n;
//foreach (var o in a)
//{
// Console.WriteLine(o);
//}
} //
//public static bool fun(int num)
//{
// if (num > 2)
// {
// return true;
// }
// else
// {
// return false;
// }
//}

2  let 

引入范围变量 在查询表达式中存储子表达式结果

            int[] temps = { , , , ,  };
IEnumerable<int> res = from temp in temps let tt = temp * where temp > select temp;

也可以select tt

            IEnumerable<int> res = from temp in temps let tt = temp *   where temp >  select tt;

在where 语句前后可以使用多个let 并且后面的let 可以引用前面let定义的变量

3.group

返回IGrouping<TKey,TElement> 对象序列

            string[] temps = { "Tom","Lucy","liy","Tim" ,"hanmei"};
var s = from temp in temps group temp by temp.Length

by 后面就是键的类型, TKey可以是任何类型。

分组结果需要嵌套循环来访问结果

            foreach(IGrouping<int, string> Name in groupName)
{
Console.WriteLine(Name.Key);
foreach (string s in Name)
{
Console.WriteLine(s);
}
}

4.orderby

排序

            string[] temps = { "Tom","Lucy","liy","Tim" ,"hanmei"};
//默认升序 ascending
//IEnumerable<string> groupName = from temp in temps orderby temp select temp;
IEnumerable<string> groupName = from temp in temps orderby temp descending select temp; foreach (var Name in groupName)
{
Console.WriteLine(Name);
}

5 into

存储临时变量

分成两组 4 6  ,5 7 存储到临时的temp 在 作为 下一个 from  in的参数

            int[] arr1 = { , , , , ,  };
var a = from n in arr1
where n >=
group n by n % into temp
from t in temp select t;
foreach (var o in a)
{
Console.WriteLine(o);
}

 6.join

三、linq 分类

linq to objects---对内存中集合的操作

linq to datasets---对数据集Datatable的操作

linq to sql ---对SQL Server数据源的操作,微软把开发的重点从LINQ to SQL转移到了LINQ to Entities并且宣布LINQ to SQL不再提供更新

linq to xml---对XML数据源的操作

linq to entities---是 Entity Framework的一部分并且取代LINQ to SQL作为在数据库上使用 LINQ的标准机制

1.linq to objects

(1)数组

            //一组成绩
int[] score = { , , , , , , };
//查询大于60的成绩并由大到小排序,默认是升序(ascending),加上descending表示降序
var result = from temp in score where temp > orderby temp descending select temp;
foreach (var s in result)
Console.Write(s + " ");
Console.ReadKey();

结果

            //一组名字
string [] name = { "Tom", "Zhao", "Jack", "Meng", "Xi", "Li" };
//调用方法,查出包含字母a的所有名字,并且所有字符转成小写
var result = from temp in name where temp.Contains("a") select temp.ToLower();
foreach (var s in result)
Console.Write(s + " ");
Console.ReadKey();

结果

(2)List<T>

    class Program
{
static void Main(string[] args)
{
List<Student> stu = new List<Student>
{
new Student{Id=,Age=,Name="tom" },
new Student{Id=, Age=,Name="li" },
new Student{Id=, Age=,Name="meimei" },
};
List<Info> info = new List<Info>
{
new Info{ Id=,Address="北京" },
new Info{ Id=,Address="天津" },
new Info{ Id=,Address="上海" },
};
/****
代码处
****/
}
}
class Student
{
public int Id { get; set; }
public int Age { get; set; }
public string Name { get; set; }
}
class Info
{
public int Id { get; set; }
public string Address { get; set; }
}

填充代码

//查询居住在天津同学的完整信息

            var all =
from s in student
from i in info
where s.Id == i.Id && i.Address == "天津"
select new { nId = s.Id, nAge = s.Age, nname = s.Name, nAddress = i.Address };
foreach (var n in all)
{
Console.Write("ID:" + n.nId + ",年龄:" + n.nAge + ",姓名:" + n.nname + ",家住:" + n.nAddress);
}
Console.ReadKey();

2.linq to datasets

            //一组名字
DataTable dt = new DataTable();
dt.Columns.Add("员工年龄", typeof(int));
dt.Columns.Add("员工姓名", typeof(string));
DataRow dr1 = dt.NewRow();
dr1["员工年龄"] = ;
dr1["员工姓名"] = "沈腾";
dt.Rows.Add(dr1); //把该行存进dt  DataRow dr2 = dt.NewRow();
dr2[] = ;
dr2[] = "马丽";
dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow();
dr3[] = ;
dr3[] = "岳云鹏";
dt.Rows.Add(dr3);
//
var name = from n in dt.AsEnumerable() where n.Field<int>("员工年龄") > select n.Field<string>("员工姓名");
foreach(var s in name)
Console.Write(s + " ");
Console.ReadKey();

3.linq to sql

LINQ to SQL 是 .NET Framework 3.5 版的一个组件,提供了用于将关系数据作为对象管理的运行时基础结构

在 LINQ to SQL 中,关系数据库的数据模型映射到用开发人员所用的编程语言表示的对象模型。 当应用程序运行时,LINQ to SQL 会将对象模型中的语言集成查询转换为 SQL,然后将它们发送到数据库进行执行。 当数据库返回结果时,LINQ to SQL 会将它们转换回您可以用您自己的编程语言处理的对象

使用 Visual Studio 的开发人员通常使用Object Relational Designer,它提供了用于实现许多 LINQ to SQL 功能的用户界面

4.linq to xml

5.linq to entities

四、流式查询语法

 1.一步一步调用

            string[] str = { "tom", "liu", "huang" };
   IEnumerable<string> query = str.Where(n=>n.Contains("u")).OrderBy(n=>n.Length).Select(n=>n.ToLower());
       foreach (string n in query) Console.WriteLine(n);
Console.ReadKey();

2.遍历时执行代码

            int[] num = { , ,  };
int i = ;
IEnumerable<int> query = num.Select(n=>n*i);
i = ;
foreach (int n in query) Console.WriteLine(n);
Console.ReadKey();

3.注意作用域

for循环中迭代的变量看成循环作用域之外的变量,所以每个闭包都时相同的变量

XXXX错误代码

    IEnumerable<char> query = "hello,world";
string arr = "aeiou"; for (int i = ; i < arr.Length; i++)
{
query = query.Where(c => c != arr[i]);
} foreach (char c in query) Console.WriteLine(c)

应该赋予一个临时变量

          for (int i = ; i < arr.Length; i++)
{
char temp = arr[i];
query = query.Where(c => c != temp);
}

五、基本查询语法

 IEnumerable<string> query = Enumerable.Where(str, n => n.Contains("u")); 

六.混合语法

统计数量

            string[] str = { "tom", "liu", "huang" };
int query = (from n in str where n.Contains("u") select n).Count();

七、子查询

(37)C#Linq的更多相关文章

  1. xamarin studio And linq 查询方式分析

    在 Windows 操作系统可以正常读取网络上的 https 数据流,在 Linux 操作系统中会失败:http://www.cnblogs.com/skyivben/archive/2012/03/ ...

  2. mahout安装和测试

    Mahout 是 Apache Software Foundation(ASF) 旗下的一个开源项目,提供一些可扩展的机器学习领域经典算法的实现,旨在帮助开发者更加方便快捷地创建智能应用程序.Apac ...

  3. C# LINQ详解(转)

    C# LINQ详解(一)   原文标题:How does it work in C#?-Part 3 (C# LINQ in detail),作者:Mohammand A Rahman. 目录 LIN ...

  4. Webform(Linq高级查、分页、组合查询)

    一.linq高级查 1.模糊查(包含) 1 public List<User> Select(string name) 2 { 3 return con.User.Where(r => ...

  5. Linq专题之查询操作

    前面我们主要讲解的是Linq的查询表达式,Linq不但提供了一些基本的查询表达式,还提供了数十个查询操作.比如筛选操作.聚合操作.投影操作等等.通过这些查询操作可以更方便的对数据源进行处理. Linq ...

  6. 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件

    [源码下载] 与众不同 windows phone (37) - 8.0 文件系统: StorageFolder, StorageFile, 通过 Uri 引用文件, 获取 SD 卡中的文件 作者:w ...

  7. Linq使用Distinct删除重复数据时如何指定所要依据的成员属性zz

    最近项目中在用Linq Distinct想要将重复的资料去除时,发现它跟Any之类的方法有点不太一样,不能很直觉的在呼叫时直接带入重复数据判断的处理逻辑,所以当我们要用某个成员属性做重复数据的判断时, ...

  8. Linq To Objects

    一.什么是Linq To Objects 从根本上说,Linq To Objects表示一种新的处理集合的方法.采用旧方法,必须编写指定如何从集合检索数据的复杂的foreach循环.而采用Linq方法 ...

  9. 使用Expression做Linq的參數化排序

    Linq非常的好用,減少大量的資料庫操作手序,使用具名的類別,減少了在程式中寫SQL寫錯字的可能性,問題來了,如果我想用QueryString中的參數,作為排序的依據,但是因為是具名的類別,不能指定字 ...

随机推荐

  1. centos6.5下,使用虚拟ftp用户

    因为业务的问题,有位客户的账户总是出现各种问题,本人对于acl的使用又不是很会,所以和同事一起研究了一下这个虚拟ftp用户. Centos6.5 1 需求 为了保证系统的安全性,现对系统中vsftpd ...

  2. java mysql 数据库

    1. jdbc 驱动名还是数据库 String driver = "com.mysql.jdbc.Driver"; //URL指向要访问的数据库名mydataString url ...

  3. 8-26接口压力测试-3Jmeter-Java请求

    1.新建maven工程 2.导入依赖,并使用shade将所需的依赖打入jar包 <?xml version="1.0" encoding="UTF-8"? ...

  4. HTML5表格(table)篇

    初学HTML接触table少不了,但是实际应用的地方也有. 简单说明HTML <table> 标签 定义和用法 <table> 标签定义 HTML 表格. 简单的 HTML 表 ...

  5. mysql的JDBC连接

    程序是通过DriverManager注册驱动,所以加载之后可以直接使用DriverMannagermysql中的多态: 不仅是赋值的时候使用了多态,返回的时候都是返回的借口(不是返回的子类对象),所以 ...

  6. 文本数据和mysql 里面的数据比较

    实现读取TXT文件中的内容然后存到内存,然后将内存中的数据和mysql 数据库里面某张表数据的字段做一个比较,如果比较内存中的数据在mysql 里存在则不做处理,如果不存在则将该数据插入mysql数据 ...

  7. 如果一个文件块有130M,请问有多少个mapper

    如果一个文件块有130M,请问有多少个mapper 130M的文件将被分成2个mapper. 原因:根据FileInputFormat类 有一个成员变量 private static final do ...

  8. spark-sql性能优化之——动态实现多个列应用同一个函数

    在对一个dataframe的多个列实现应用同一个函数时,是否能动态的指定? 例如: 对A,B,C三列实现分组统计 1.初始化spark,构建DF val spark = SparkSession.bu ...

  9. PyTorch中,关于model.eval()和torch.no_grad()

    一直对于model.eval()和torch.no_grad()有些疑惑 之前看博客说,只用torch.no_grad()即可 但是今天查资料,发现不是这样,而是两者都用,因为两者有着不同的作用 引用 ...

  10. 大道浮屠诀---mysql5.7.28 for linux安装

    环境: redhat6.5 MySQL Community Server 5.7.28 https://dev.mysql.com/downloads/mysql/5.7.html 安装RMP包的具体 ...