可能你不知道的 Select 的用法 和提点建议 返回

C#论坛 老数据
1 3250
该叫什么 抱走 发布于2017/7/5
悬赏:5 飞吻
场景:
很多时候, 我们的实体模型和业务模型,可能的写法是这样的:
// 生成的学生表模型
public class Student{
  public int id {get;set;}
  public string name {get; set;}
  public  int classRoom {get; set;}
}
//生成的课程表实体模型
public class Subject{
  public int id {get; set;}
  public string name{ get;set;}
  public int studentId {get;set;}
}
//生成的教室表实体模型
public class Subject{
  public int id {get; set;}
  public string name{ get;set;}
}

/////  视图模型 /////
一般会有2种写法
public class vStudentSubject{
  public Student student {get; set;}
  public string classRoomName {get; set;}
  public List<Subject> subjects {get; set;}
}

这种比较方便这样使用
List<vStudentSubject> retMd = db.Queryable<Student, Subject, vStudentSuject>((sd, sj, r)=>...)..... //这里省略条件等
                .select((sd, sj, r)=> new { sd=sd, sj=sj, r=r})
                .toList()
                .groupBy(a=>a.sd)
                .select(g=>new vStudentSubject{student=g.key, classRoomName=g.First().r.name subjects = g.ToList()})
                .ToList();

好了,其实另外一种写法是继承

public class vStudentSubject: Student{
  public List<Subject> subjects {get; set;}
}

这样很多情况非常方便,类似星形模型等(就是实体表里面都是id,名称等属性都是关联其他关系表),非常合适继承的写法

我们不要忘记,还有字符串参数版本的select,不需要你一个一个属性赋值:

List<vStudentSubject> retMd = db.Queryable<Student, Subject, vStudentSuject>((sd, sj, r)=>...)..... //这里省略条件等
                .select<vStudentSubject>("sd.*, r.name")
                .toList();

这里,剩下的就是retMd里面学生和教室名字都会被赋值,剩下课程列表了,课程列表是列表的形式,这里不好处理,因为字符串版本参数的select,返回类型不能动态,只能是返回一个参数T的或者是自己决定返回类型的2个重载,这时候如果需要这个列表,继续下一部查询赋值就好了。但是对于非列表的方式,还是非常方便的。


如果,有一种select,是这样设计的 ISugarQueryable<TResult> Select<TResult>(Expression<Func<T,T2,...,TResult>> express, string select);

可以结合起来,对TResult 属性赋值根据字符串来, 对于T,T2... 的对象的赋值,通过 express来。


另外请教下各位大神们 List<T> 这种 有什么艺术性的写法呢?




热忱回答1