【问题标题】:Executing raw SQL string using linq2db使用 linq2db 执行原始 SQL 字符串
【发布时间】:2018-06-17 20:02:00
【问题描述】:

使用 linq2db (https://github.com/linq2db/linq2db) 可以执行原始 SQL 字符串并将结果作为dynamic 获取吗?

我正在寻找类似 ADO.NET 的 DBCommand.ExecuteReader 或 Dapper 的 Query<dynamic>

【问题讨论】:

    标签: c# linq2db


    【解决方案1】:

    linq2db 是强类型的,但您可以执行原始 sql 并将结果映射到匿名类。例如:

    var result = ExecuteAnonymous(db, 
        "select id, name from sysobjects", 
        new { id = 0, name = "" });
    

    其中 ExecuteAnonumous 是辅助方法:

    IQueryable<T> ExecuteAnonymous(DataConnection db, string sql, T typeObject)
    {
        return db.Query<T>(sql);
    }
    

    【讨论】:

    • linq2db 像您的 ExecuteAnonymous 一样具有“查询”重载(静态 IEnumerable Query(此 DataConnection 连接,T 模板,字符串 sql,参数 DataParameter[] 参数))
    【解决方案2】:

    您可以自己轻松实现:

                foreach (var rec in DataConnection.Query<dynamic>(reader =>
                {
                    IDictionary<string, object> eo = new ExpandoObject();
                    for (var index = 0; index < reader.FieldCount; index++)
                    {
                        eo.Add(reader.GetName(index), reader.GetValue(index));
                    }
                    return eo;
                }, "select first 2 \"Guid\", \"DongleID\" from \"Sellings\""))
                {
                    Console.WriteLine(rec.DongleID);
                }
    

    【讨论】:

      【解决方案3】:

      首先,您需要创建一个类,该类具有与查询结果一样多的属性。

      第二个重要的事情是,您需要为此类的每个属性添加属性,以匹配执行此“选择”后生成的列的名称。例如:[Column(@"user_firstname")]

      之后,您可以将此类放入查询的调用中。我可以演示一下:

      using (var db = new TestDB())
      {
         var usersList = db.Query<YourCustomClass>("your select query here").ToList();
      }
      

      现在,您将拥有“YourCustomClass”类型列表中的所有数据。

      我希望这是您正在寻找的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-20
        • 2019-11-02
        • 1970-01-01
        • 2017-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-18
        相关资源
        最近更新 更多