投影运算
Obase增加了对关联引用的投影支持,这里使用之前快速入门中使用过的班级和学生间的关系作为示例。之前已经演示过对关联引用使用单参数的Select和SelectMany了,这里快速复习一下: 对于多重性为0,1的关联,可以使用指向关联引用的表达式作为参数传入Select最后ToList,得到的结果是关联引用的集合;对于多重性为0,*的关联,可以使用指向关联引用的表达式作为参数传入Select或者SelectMany最后ToList,得到的结果是关联引用的集合的集合或者关联引用的集合。 接下来我们将介绍几个其他的投影方法,首先我们先引入一个常见的简单类,在使用模型返回Json 等格式时,序列化时经常要去掉引用对象,这个类就是模拟的这种情况:
/// <summary>
/// 简单Stu类 符合Json命名标准
/// </summary>
public class SimpleStu
{
/// <summary>
/// ID
/// </summary>
public long Id { get; set; }
/// <summary>
/// 名字
/// </summary>
public string StudentName { get; set; }
}
我们把学生投影成简单的Stu对象:
//投影成其他对象
var stu3 = context.Students.Select(s => new SimpleStu {StudentName = s.Name, Id = s.StudentId})
.Where(p => p.StudentName != "").ToList();
这里得到的结果就是一个SimpleStu对象集合。当然有些时候我们并不想定义一个类来表示这种简单对象,因为很多时候创建一个匿名对象更容易,那么我们也可以这样投影:
var stu2 = context.Students.Select(s => new {name = s.Name, id = s.StudentId}).Where(p => p.name != "")
.ToList();
这里得到的就是一个匿名对象。 对于一对多的情况,SelectMany则支持更多的投影方式:
//一对多 SelectMany至关联引用 并使用本集合和投影后集合构造匿名对象
var stu6 = context.Classes.SelectMany(p => p.Students, (_, s) => new {name = s.Name, Id = s.StudentId})
.ToList();
这里第二参数是两个参数的表达式,第一个参数是投影源,即Class;第二个参数是Student即关联引用,这里我构造匿名对象时没有使用Class中的属性,所以使用 " _ " 来表示未使用的参数。得到的结果是一个匿名对象的集合。
//一对多 SelectMany至关联引用 并使用本集合和投影后集合构造其他对象
var stu7 = context.Classes
.SelectMany(p => p.Students, (p, s) => new SimpleStu {Id = s.StudentId, StudentName = s.Name})
.ToList();
那么自然而然的也可以投影成简单对象,得到的是一个简单对象的集合。
最后,我们自然可以对对象的一般属性进行投影,这部分和Linq中时相同的,这里就不再赘述了,具体可以参考如下的代码:
//此处为投影到一般属性 stuNames为一个字符串列表 内含两个学生的名字
var stuNames = selectContext.Students.Select(p => p.Name).ToList();
//此处为投影到关联对象的一般属性 stuClassName为一个字符串列表 内含两个学班级的名字
var stuClassName = selectContext.Students.Select(p => p.Class.Name).ToList();