1、集合常用扩展方法

Where、Max、Min、OrderBy、

Select、//投影后的IEnumerable对象可以通过,AsQueryable转换数据类型

First、FirstOrDefault

Single、SingleOrDefault

Any()判断集合是否包含元素,返回值 bool,一般比 Coun()>0 效率高。 Any 还可以指

      bool b = list.Any(p => p.Age > 50);

  等 bool b =list.Where(p=>p.Age>50).Any(); 

Distinct(),剔除完全重复数据 

排序升序 list.OrderBy(p=>p.Age)

    降序 list.OrderByDescending(p=>p.Age)。

  指定多个排序规则OrderBy list.OrderByDescending(p=>p.Age).ThenBy(p=>p.Salary),

  也支持 ThenByDescending()。注意这些操作不会影响原始的集合数据。 

Skip(n)跳过前 n 条数据;

Take(n)获取最多 n 条数据,如果不足 n 条也不会报错。

常用来分页获取数据。 list.Skip(3).Take(2)跳过前 3 条数据获取 2 条数据。 

Except(items1)排除当前集合中在 items1 中存在的元素 

Union(items1)把当前集合和 items1 中组合。 

Intersect(items1) 把当前集合和 items1 中取交集。 

分组:

1 IEnumerable<IGrouping<int,Person>> items=list.GroupBy(g=>g.Age);
2 foreach(IGrouping<int,Person> item in items){
3     Console.WriteLine("Key="+item.Key);
4     foreach(Person p in item){
5         Console.WriteLine(p);
6     }
7 }
8 
9 Console.ReadKey();

Linq、延迟加载、直接加载

 

SelectMany:把集合中每个对象的另外集合属性的值重新拼接为一个新的集合
foreach(var s in teachers.SelectMany(t => t.Students))
{
Console.WriteLine(s);//每个元素都是 Person
}
注意不会去重,如果需要去重要自己再次调用 Distinct() 

Join 可以实现和数据库一样的 Join 效果,对有关联关系的数据进行联合查询
下面的语句查询所有 Id=1 的狗,并且查询狗的主人的姓名。
var result = dogs.Where(d => d.Id > 1).Join(masters, d => d.MasterId, m => m.Id,
(d,m)=>new {DogName=d.Name,MasterName=m.Name}); 

 

Linq表达式原理:

在写Linq表达式并完成IQueryable<>对象创建的初始化过程:声明元素类型,建立Expression对象,把Linq表达式进行解析,拆分,解析成一个表达式树,也就是对Lambda表达式的解析过程,

Expression对象以表达式树结构存储解析结果。最后根据LINQ表达式类型给IQueryableProvider属性赋值。在需要读取数据的时候Provider属性就去解析Expression表达式树执行查询返回。

 

2、延迟加载 

解析:被延迟加载的类或者集合大多都被virtual修饰;被修饰后,可以使用当前类的导航属性。eg

public class Students{

 

public int id{get;set;}

 

public string name{get;set;}

 

public virtual Class class{get;set;}

 

}
Students

相关文章:

  • 2022-12-23
  • 2021-11-28
  • 2021-12-31
  • 2021-08-02
猜你喜欢
  • 2021-09-03
  • 2022-02-08
  • 2021-11-22
  • 2021-08-07
  • 2021-06-10
  • 2021-11-17
相关资源
相似解决方案