我正在使用ServiceStack.Ormlite.MySql SqlJoinBuilder加入来自MySql DB的select
问题是,组成的SQL查询是有效的,但抛出了onConnection.Select<TEntity>(sql)InvalidCast Exception。当我使用JoinSqlBuilderOrmLite.SqlServer时,没有这样的错误。
这是我的方法代码:

const int take = 20;
        Expression<Func<smt2_browser_data, object>> browserDataSelectFunc =
            browserdata => new { browserdata.os_type, browserdata.agent_name };
        Expression<Func<smt2_records, object>> recordselectFunc =
            record =>
            new
                {
                    record.id,
                    record.client_id,
                    record.cache_id,
                    record.domain_id,
                    record.os_id,
                    record.browser_id,
                    record.browser_ver,
                    record.user_agent,
                    record.ftu,
                    record.ip,
                    record.scr_height,
                    record.scr_width,
                    record.vp_height,
                    record.vp_width,
                    record.sess_date,
                    record.sess_time,
                    record.fps,
                    record.page_canvas,
                    record.location_id,
                    record.country,
                    browser_version_id = record.browser_data_id
                };
        var sql = new JoinSqlBuilder<smt2_browser_data, smt2_records>()
            .Join<smt2_browser_data, smt2_records>(browserdata => browserdata.id, record => record.browser_data_id, browserDataSelectFunc, recordselectFunc)
            .Join<smt2_records, smt2_cache>(record => record.cache_id, cache => cache.id)
            .Join<smt2_records, smt2_browsers>(record => record.browser_id, browser => browser.id)
            .Join<smt2_records, smt2_os>(record => record.os_id, os => os.id)
            .Join<smt2_records, smt2_domains>(record => record.domain_id, domain => domain.id)
            .Where<smt2_domains>(domain => domain.domain == domainName)
            .Where<smt2_records>(record => record.sess_date >= dateFrom && record.sess_date <= dateTo)
            .OrderByDescending<smt2_records>(record => record.sess_date)
            .ToSql()
            .Limit(1, take);


        var records = this.Connection.Select<RecordInfo>(sql);

和阶级
public class RecordInfo
    {
        public decimal id { get; set; }
        public string client_id { get; set; }
        public decimal cache_id { get; set; }
        public int domain_id { get; set; }
        public byte os_id { get; set; }
        public string os_type { get; set; }
        public byte browser_id { get; set; }
        public string agent_name { get; set; }
        public float browser_ver { get; set; }
        public string user_agent { get; set; }
        public bool ftu { get; set; }
        public string ip { get; set; }
        public int? scr_width { get; set; }
        public int scr_height { get; set; }
        public int vp_width { get; set; }
        public int vp_height { get; set; }
        public DateTime sess_date { get; set; }
        public float sess_time { get; set; }
        public byte fps { get; set; }
        public string page_canvas { get; set; }
        public int? location_id { get; set; }
        public string country { get; set; }
        public decimal? browser_version_id { get; set; }
    }

谢谢你的建议!

最佳答案

发现问题:
DB类型bigint在DTO中被转换为decimal
刚刚将decimal更改为long

关于c# - ServiceStack.Ormlite.MySql SqlJoinBuilder无效的强制转换异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21906717/

10-12 22:40