如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了

一:背景

1. 讲故事

记的在上一家公司做全内存项目的时候,因为一些关键表会在程序 startup 的时候全量灌入到内存中,但随着时间的推移,内存和数据库的同步偶尔会出现数据差异的情况,伴随着就是运营那边报过来的 bug,检查数据库的数据完整性很简单,直接写一些 sql 验证一下就好了,但校验内存中的数据就非常麻烦了,因为你不能像写 sql 一样直接去查生产中的内存集合,那怎么办呢?为了方便演示问题,先上一段演示代码:

class Program
    {
        static void Main(string[] args)
        {
            var tradeList = new List()
            {
                new Trade(){TradeID=1, TradeTitle="交易1", Created=Convert.ToDateTime("2020/8/1"), CustomerID=1},
                new Trade(){TradeID=2, TradeTitle="交易2", Created=Convert.ToDateTime("2020/8/5"),CustomerID=2},
                new Trade(){TradeID=3, TradeTitle="交易3", Created=Convert.ToDateTime("2020/8/10"), CustomerID=3}
            };
        }
    }

    class Trade
    {
        public int TradeID { get; set; }

        public string TradeTitle { get; set; }

        public DateTime Created { get; set; }

        public int CustomerID { get; set; }
    }

上面的 tradeList 就是内存中的集合,现在有一个问题,我想查询一下 trade 表中 CustomerID in (1,2,10) && Created 0) { query = query.Where(m => queryCustomerIDList.Contains(m.CustomerID)); } if (string.IsNullOrEmpty(queryCreated)) { query = query.Where(m => m.Created new Trade() { TradeID = Convert.ToInt32(m[0]), TradeTitle = Convert.ToString(m[1]), Created = Convert.ToDateTime(m[2]), CustomerID = Convert.ToInt32(3) }).ToList(); } public static DataTable CopyToDataTable(IEnumerable array) { var ret = new DataTable(); foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) ret.Columns.Add(dp.Name); foreach (T item in array) { var Row = ret.NewRow(); foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) Row[dp.Name] = dp.GetValue(item); ret.Rows.Add(Row); } return ret; }