【问题标题】:Does ORMLite support dynamic Type of C#?ORMLite 是否支持 C# 的动态类型?
【发布时间】:2014-12-18 02:05:47
【问题描述】:

我正在从 ServiceStack 研究 ORMLite,我在这里尝试做的是调用一个存储过程,该过程又返回许多行,这些行肯定不会绑定到任何域对象,但也可能有也可能没有 dto映射的对象。我想知道我是否可以将它绑定到一个类型。但是,听起来 ORMLite 目前不支持动态类型绑定。 ORMLite 目前支持吗?

【问题讨论】:

    标签: c# orm servicestack ormlite-servicestack


    【解决方案1】:

    根据设计,OrmLite 不支持编组为动态类型,并希望将结果集映射到 Typed POCO。

    虽然它确实有专门的 API 来使用 C# 7 元组访问 Dynamic Result Sets

    var query = db.From<Employee>()
        .Join<Department>()
        .OrderBy(e => e.Id)
        .Select<Employee, Department>(
            (e, d) => new { e.Id, e.LastName, d.Name });
    
    var results = db.Select<(int id, string lastName, string deptName)>(query);
    
    var row = results[i];
    $"row: ${row.id}, ${row.lastName}, ${row.deptName}".Print();
    

    List&lt;object&gt;:

    db.Select<List<object>>(db.From<Poco>()
      .Select("COUNT(*), MIN(Id), MAX(Id)"))[0].PrintDump();
    
    /* Output */
    [
        10,
        1,
        10
    ]
    

    或使用Dictionary&lt;string,object&gt;,例如:

    db.Select<Dictionary<string,object>>(db.From<Poco>()
      .Select("COUNT(*) Total, MIN(Id) MinId, MAX(Id) MaxId"))[0].PrintDump();
    
    /* Output */
    {
        Total: 10,
        MinId: 1,
        MaxId: 10
    }
    

    除了能够映射到松散类型的 .NET 集合之外:

    Dictionary<int, string> trackIdNamesMap = db.Dictionary<int, string>(
        "select Id, Name from Track")
    
    Dictionary<int, List<string>> albumTrackNames = db.Lookup<int, string>(
        "select AlbumId, Name from Track")
    
    List<string> trackNames = db.Column<string>("select Name from Track")
    
    HashSet<string> uniqueTrackNames = db.ColumnDistinct<string>("select Name from Track")
    

    使用 Dapper 的查询

    OrmLite 确实有 Dapper 的嵌入式版本 does support dynamic results:

    using ServiceStack.OrmLite.Dapper;
    
    using (var db = new SqlConnection(@"Data Source=... etc."))
    {
        db.Open();
    
        var p = new DynamicParameters();
        p.Add("@params", "Id=21");
    
        IEnumerable<dynamic> dynamicResults = db.Query(sql:"GetPivotData", param: p,
            commandType:CommandType.StoredProcedure);
    }
    

    【讨论】:

      猜你喜欢
      • 2016-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-02
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多