ORM 框架设计想法搜集

内容纲要

想设计一个ORM框架,在评论写下想法,思考,需求。

点赞
  1. whuanle说道:

    对于表达式树要有限定。
    EFCore 中,有

    public static IQueryable Where(this IQueryable source, Expression> predicate);

    但是这样往往会出问题,例如加上全球化选项导致无法识别。
    使用

    Where.(x => x.EquipNm.Contains(model.SearchWord)
    Where.(x => Nos.Any(n=>n==x.No)

    这些情况对于 List int[] 等情况适应用,但是一旦属于复杂类型,会导致出现问题。
    因此不能使用直接 this IQueryable source, Expression ,同时必须考虑到表达式可以使用的参数类型。

  2. whuanle说道:

    最基础的是对象映射,执行SQL后,映射到类对象中。
    类似 dapper

    var query = _dapperContext.Query("SELECT et.Id, et.Name, et.Describe,etr.EquipTypeId, etr.EquipId AS EquipNo, (SELECT IFNULL(e.equip_nm,'设备不存在')) AS EquipNm, e.equip_detail AS EquipDetail FROM EquipType et LEFT JOIN EquipTypeRelation etr ON et.Id = etr.EquipTypeId LEFT JOIN Equip e ON e.equip_no = etr.EquipId LIMIT 20 OFFSET 5").ToList();

  3. whuanle说道:

    自定义特性,只需要一个特性即可配置一个类或属性,不需要多配置。
    或者兼容EFCore的特性

  4. whuanle说道:

    支持连接池。
    同时提供两种方式,并且全局配置连接池大小。
    提供连接池查询和直接查询。

  5. whuanle说道:

    if ()
    query.Where()
    else
    query.Where()

    query.Join()

    虽然 where 在 join 前,但是生成SQL时,where要在最后。
    如果这样的话,链式表达式会带来很多麻烦。
    可以将不同类型分开存储,使用是主动拼起来。按照顺序组合

  6. whuanle说道:
    _context.Union(_context.A.select(x=>new{ x1,x2,x3},_context.B.select(x=>new{ x1,x2,x3})).Skip()....
    

    支持这样的查询

发表评论

电子邮件地址不会被公开。 必填项已用*标注