精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何校驗內存數據的一致性,DynamicExpresso 算是幫上大忙了

開發 前端
總的來說,有了DynamicExpresso ,我就可以將 文本化的 C#語句 直接丟給 Where 條件就可以靈活檢索,完美的解決了在內存中查詢 tradelist 數據分布情況,當然目前的 DynamicExpresso 還有很多語句不支持,不過都在完善中,期待大家支持點贊加貢獻。

一:背景

1. 講故事

記的在上一家公司做全內存項目的時候,因為一些關鍵表會在程序 startup 的時候全量灌入到內存中,但隨著時間的推移,內存和數據庫的同步偶爾會出現數據差異的情況,伴隨著就是運營那邊報過來的 bug,檢查數據庫的數據完整性很簡單,直接寫一些 sql 驗證一下就好了,但校驗內存中的數據就非常麻煩了,因為你不能像寫 sql 一樣直接去查生產中的內存集合,那怎么辦呢?為了方便演示問題,先上一段演示代碼:

class Program
    {
        static void Main(string[] args)
        {
            var tradeList = new List<Trade>()
            {
                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 <= '2020-08-01' 的記錄是否和內存中的 tradelist 一致。

用 sql 驗證太簡單了,直接在查詢分析器里面寫一下sql 搞定,如下圖:

圖片圖片

那在 UI 上 怎么驗證呢?

二:尋找解決方法

1. 在UI上自定義高級查詢

這個也是大家最容易想到的,使用多個 if 疊加查詢條件,如下代碼所示:

static void Main(string[] args)
        {
            var tradeList = new List<Trade>()
            {
                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}
            };

            IEnumerable<Trade> query = tradeList;

            //UI
            var queryCustomerIDList = new List<int>() { 1, 2, 10};
            var queryCreated = "2020-08-01";

            if (queryCustomerIDList.Count > 0)
            {
                query = query.Where(m => queryCustomerIDList.Contains(m.CustomerID));
            }
            if (string.IsNullOrEmpty(queryCreated))
            {
                query = query.Where(m => m.Created <= Convert.ToDateTime(queryCreated));
            }

            //最后的結果
            var list = query.ToList();
        }

圖片圖片

問題貌似是可以解決,但是這種用 if 疊加的方式不覺得太不靈活了嗎?如果客戶心情不好,又來了一個 TradeID between 1 and 10 的篩選條件,那上面的代碼是不是還得加一個 TradeID 的判斷 ?太麻煩了,還得繼續尋找更靈活的姿勢。

2. 使用DataTable

哈哈,大家看到 DataTable 是不是有一點懵逼,可不要小瞧這玩意,人家可是直接支持 sql 查詢的哦,這靈活性不容小覷哈,上一段代碼說話:

static void Main(string[] args)
        {
            var tradeList = new List<Trade>()
            {
                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=1},
                new Trade(){TradeID=3, TradeTitle="交易3", Created=Convert.ToDateTime("2020/8/10"), CustomerID=3}
            };

            var table = CopyToDataTable(tradeList);

            var query = table.Select("CustomerID in (1,2,10) and Created <= '2020-08-01' and TradeID >= 1 and TradeID <= 10")
                            .Select(m => 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<T>(IEnumerable<T> 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;
        }

圖片圖片

是不是很強大,直接將文本化的 sql 塞入到 DataTable 中,你想什么樣的查詢你就寫什么樣的 sql 就 ok 啦,當然,理論歸理論,在我的場景中肯定是不會這么玩的,畢竟內存中的 trade 有上千萬行,轉成 DataTable 不是給自己挖坑嘛,那有沒有其他的方式呢?

3. 使用 表達式樹 (ExpressionTree)

我想很多人看到 表達式樹 都會退避三舍,雖然這玩意很強大,但是太復雜了,它會將你的查詢語句拆解成樹中的節點從而構建一棵非常復雜的樹結構,其實 DataTable 對 sql語句的解析也是在內存中構建了一棵解析樹,所以這玩意太反人類了,比如你要構建 i > 5 的查詢,你需要下面這樣的硬編碼,這還是非常簡單的哈,復雜的會讓你吐血。

ParameterExpression param = Expression.Parameter(typeof(int), "i");
            ConstantExpression constExp = Expression.Constant(5, typeof(int));
            BinaryExpression greaterThan = Expression.GreaterThan(param, constExp);
            Expression<Func<int, bool>> f = Expression.Lambda<Func<int, bool>>(greaterThan, param);
            Func<int, bool> mydelegate = f.Compile();
            Console.WriteLine(mydelegate(5));

圖片圖片

從圖中可以看到,5>5 = False 是沒有問題的,既然表達式樹是可以解決類似這樣的場景,聰明的你應該會想到,開源社區是否又類似封裝好的 ExpressionTree 開發包呢?說實話,還真有。。。

4. DynamicExpresso 開發工具包

開源大法好,github地址:https://github.com/davideicardi/DynamicExpresso , 這玩意實現了 將文本化的 C# 語句 動態轉換成 delegate,這句話是什么意思呢?大家可以看一下這張圖:

圖片圖片

從上圖可以看到,你可以 寫一些文本化的 C# 語句,然后經過 DynamicExpresso 處理后轉換成了可執行 delegate,如果你沒看懂,我用代碼表示一下,如下圖:

圖片

其中: 30 = 5 * 8 / 2 + 10 ,重點在于這里的 數學表達式 是文本的,有了這個思路,那我是不是也可以將 tradeList 的查詢條件文本化表示,如下代碼:

var interpreter = new Interpreter();

            interpreter.Reference(typeof(System.Linq.Enumerable));

            interpreter.SetVariable("arr", new int[] { 1, 2, 10 });

            string whereExpression = "(trade.CustomerID == 1 || trade.CustomerID==2 || trade.CustomerID==10) && " +
                                     "trade.Created <= Convert.ToDateTime(\"2020-08-01\") &&" +
                                     "trade.TradeID >= 1 && " +
                                     "trade.TradeID <=10";

            Func<Trade, bool> queryFunc = interpreter.ParseAsDelegate<Func<Trade, bool>>(whereExpression, "trade");

            var list = tradeList.Where(queryFunc).ToList();

            var i = Enumerable.Contains(new int[] { 1, 2, 3 }, 3);

圖片圖片

問題搞定,還是比較完美的 ??????

三:總結

總的來說,有了DynamicExpresso ,我就可以將 文本化的 C#語句 直接丟給 Where 條件就可以靈活檢索,完美的解決了在內存中查詢 tradelist 數據分布情況,當然目前的 DynamicExpresso 還有很多語句不支持,不過都在完善中,期待大家支持點贊加貢獻。

責任編輯:武曉燕 來源: 一線碼農聊技術
相關推薦

2019-08-30 12:46:10

并發扣款查詢SQL

2025-03-27 08:20:54

2017-07-25 14:38:56

數據庫一致性非鎖定讀一致性鎖定讀

2017-06-27 09:40:28

MYSQL數據備份

2021-03-04 06:49:53

RocketMQ事務

2022-10-19 12:22:53

并發扣款一致性

2024-12-26 15:01:29

2021-07-26 06:33:42

CRDT數據CAP

2023-09-07 08:11:24

Redis管道機制

2022-12-14 08:23:30

2024-07-04 07:35:41

2019-10-16 00:06:08

CPU內存存儲

2021-12-14 07:15:57

MySQLRedis數據

2024-10-28 12:41:25

2022-03-29 10:39:10

緩存數據庫數據

2024-10-16 09:53:07

2022-09-15 10:37:46

MySQLRedis數據一致性

2020-08-05 08:46:10

NFS網絡文件系統

2024-08-20 16:13:52

2023-05-26 07:34:50

RedisMySQL緩存
點贊
收藏

51CTO技術棧公眾號

欧美综合第一页| 欧美不卡视频一区| www.午夜色| www.五月天激情| 久久精品伊人| 免费成人高清视频| 一区二区三区免费在线观看视频 | 欧美日本中文字幕| 日韩乱码人妻无码中文字幕久久| 伊人久久一区| 欧美性xxxxx| 欧美aaa在线观看| 四虎精品成人免费网站| 久久99精品国产91久久来源| 亚洲91av视频| 亚洲二区在线播放| 欧美顶级毛片在线播放| 91精品在线麻豆| 久久人妻精品白浆国产 | 亚洲欧洲综合另类在线| 久久精品五月婷婷| 国产成人精品亚洲精品色欲| 久久激情视频| 久久777国产线看观看精品| 国产一级久久久久毛片精品| 久久97久久97精品免视看秋霞| 欧美日韩国产高清一区二区三区| 日韩av综合在线观看| 黄色免费在线观看| 中文字幕欧美激情一区| 久久手机视频| 色综合视频在线| 国产99久久久国产精品潘金| 国产精品亚洲激情| japanese国产在线观看| 亚洲自拍另类| 3344国产精品免费看| 精品无码人妻一区二区三| 91精品亚洲| 视频在线一区二区| 国产黄色录像视频| 欧美美女一区| 亚洲精品动漫100p| 中文在线永久免费观看| 加勒比久久高清| 亚洲国产精久久久久久久| 麻豆传媒在线看| 96sao精品免费视频观看| 欧美久久久久免费| theporn国产精品| 性欧美video另类hd尤物| 欧美日韩亚洲综合在线 | 国产精品一二三四| 91麻豆桃色免费看| 国产老女人乱淫免费| 激情成人综合网| 亚洲一区二区三区四区在线播放| 国产精品一区二区三区在线免费观看| 久久69国产一区二区蜜臀| 成人免费午夜电影| www.日韩高清| 白白色亚洲国产精品| 黑人另类av| 亚洲色图21p| 久久精品亚洲一区二区三区浴池| 久久66热这里只有精品| 精品推荐蜜桃传媒| 欧美国产欧美亚州国产日韩mv天天看完整| 日本一区视频在线| 日韩欧美小视频| 亚洲另类在线制服丝袜| 日韩黄色短视频| 中文字幕在线视频久| 91国产丝袜在线播放| 亚洲综合婷婷久久| 无码国模国产在线观看| 日韩av在线直播| 四虎永久免费在线观看| 久久亚洲国产| 欧美激情视频一区| 国产性生活视频| 精品一区二区三区欧美| 国产精品免费一区二区三区在线观看 | 国产3级在线观看| 欧美日韩一区二区高清| 91成人国产在线观看| 成人午夜精品视频| 国产高清久久久| 久久人人爽爽人人爽人人片av| 岛国在线大片| 亚洲图片欧美色图| 男人插女人下面免费视频| 欧美一级大片在线视频| 精品一区电影国产| 疯狂试爱三2浴室激情视频| 一区二区日韩免费看| 国产精品露脸av在线| 亚洲福利在线观看视频| 国产亚洲人成网站| 免费的av在线| 外国电影一区二区| 精品av综合导航| youjizz亚洲女人| 亚洲久久一区| 91精品久久久久久| 视频一区二区三区在线看免费看| 亚洲人成电影网站色mp4| 免费无码av片在线观看| 亚洲啊v在线免费视频| 国产一区二区三区在线观看网站| 久草资源在线视频| 久久精品免费观看| 久久亚洲国产精品日日av夜夜| 国产美女av在线| 在线亚洲精品福利网址导航| 人妻av一区二区| 中文精品久久| 国产欧美精品一区二区三区介绍| 头脑特工队2免费完整版在线观看| 亚洲图片激情小说| 久热精品在线播放| 国内精品久久久久久久影视简单 | 国产日韩久久久| 成人av在线观| 久久久国内精品| 亚洲伊人精品酒店| 在线日韩第一页| 免费看日批视频| 成人av在线影院| 国产精品www在线观看| 精品久久国产一区| 北条麻妃99精品青青久久| 最新中文字幕第一页| 久久久五月婷婷| 一本大道熟女人妻中文字幕在线 | 国产www在线| 成人黄色网址在线观看| 伊人久久在线观看| 亚洲精品一二三**| 久久偷看各类女兵18女厕嘘嘘| 一区二区视频网| 欧美国产1区2区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 狠狠色丁香婷婷综合久久片| 天天好比中文综合网| 欧美性理论片在线观看片免费| 亚洲美女av电影| 亚洲视频 欧美视频| 久久久欧美精品sm网站| 一本大道熟女人妻中文字幕在线| 先锋影音国产精品| 国产999精品久久久影片官网| 青青草在线免费观看| 日韩欧美国产中文字幕| 你懂的在线观看网站| 99国产成+人+综合+亚洲欧美| 精品欧美一区二区久久久伦| 日韩大片免费观看| 亚洲欧美国内爽妇网| 国产偷人爽久久久久久老妇app| 国产调教视频一区| 红桃视频 国产| 午夜精品久久| 久久爱av电影| 成人深夜福利| 欧美精品手机在线| 天天av天天翘| 在线亚洲欧美专区二区| 91n在线视频| 国产精品白丝jk白祙喷水网站| 男女激情免费视频| 亚洲国产最新| 成人国产在线激情| 国模私拍一区二区国模曼安| 亚洲欧洲激情在线| 国产免费的av| 欧美日韩国产综合新一区 | 国产精品夫妻激情| av网址在线看| 亚洲国产天堂久久国产91 | 日韩一区二区三区高清| 国产精品一站二站| 欧美一区二区三区四区在线| 137大胆人体在线观看| 日韩欧美三级在线| 欧美超碰在线观看| 亚洲色图都市小说| 添女人荫蒂视频| 精品一二线国产| 国产h视频在线播放| 欧美成人直播| 精品一区二区三区国产| 天堂综合在线播放| 国产91|九色| 2024最新电影免费在线观看| 精品偷拍各种wc美女嘘嘘| 国产精品玖玖玖| 欧美性猛交xxxxx免费看| 日韩一级片大全| 久久五月婷婷丁香社区| 91精品国产高清91久久久久久| 日日夜夜精品免费视频| 男女激情免费视频| 天天做天天爱天天综合网| 裸体丰满少妇做受久久99精品| 久久伊人久久| 国产精品自拍偷拍| 欧美激情喷水| 国内精品模特av私拍在线观看| 亚洲成人三级| 亚洲视频在线播放| 午夜视频免费在线| 欧美大肚乱孕交hd孕妇| 亚洲综合精品国产一区二区三区 | 思热99re视热频这里只精品| 亚洲aa在线观看| 成人国产精品入口免费视频| 欧美一级黄色网| heyzo在线播放| 欧美成人精品在线播放| 自拍视频在线| 国产午夜精品视频| 日韩电影在线观看完整版| 精品国产三级电影在线观看| 国产男女猛烈无遮挡| 欧美视频在线一区二区三区 | 国产丝袜视频在线播放| 久久视频免费在线播放| 99免在线观看免费视频高清| 亚洲欧美国产视频| 黄色大片在线看| 国产手机视频精品| 日本人妖在线| 亚洲欧美999| 日韩国产福利| 亚洲人成伊人成综合网久久久| 午夜成人鲁丝片午夜精品| 日韩成人激情视频| 少妇一区二区三区四区| 亚洲国产成人在线播放| 天天爽夜夜爽夜夜爽| 亚洲国产高清高潮精品美女| 天天干视频在线观看| 亚洲经典中文字幕| 天天躁日日躁狠狠躁伊人| 日韩电影网在线| 欧美高清电影在线| 亚洲天堂av网| 色影院视频在线| 精品国偷自产在线| jizz性欧美| 久久91亚洲精品中文字幕| 免费不卡av| 97在线观看免费| 欧美性猛交xxx高清大费中文| 国产高清在线不卡| 国产综合色激情| 亚洲精品免费网站| 白白在线精品| 美国av一区二区三区| 不卡日本视频| 男人天堂新网址| 99精品国产一区二区青青牛奶| 国产日韩一区二区在线| 日韩二区三区四区| www.国产福利| 粉嫩一区二区三区性色av| 国产肉体xxxx裸体784大胆| 国产性天天综合网| 成人18视频免费69| 亚洲影视在线播放| 久久久蜜桃一区二区| 欧美日本在线一区| 亚洲国产精品久久人人爱潘金莲 | 99国产精品久久久久老师| 国产香蕉精品| 午夜视频久久久| 欧美激情一区| 无遮挡又爽又刺激的视频| 久草在线在线精品观看| 东京热av一区| 欧美国产综合色视频| 亚洲国产精品久| 色婷婷综合激情| 精品国产av鲁一鲁一区| 日韩久久免费视频| av免费在线观| 日韩av色在线| 五月亚洲婷婷| 亚洲一二三区精品| 在线亚洲免费| 91蝌蚪视频在线| 国产网站一区二区| 国产精品成人免费一区二区视频| 在线看日本不卡| 日韩中文字幕影院| 日韩在线观看免费全| 日韩理论视频| 成人免费视频视频在| 日韩黄色大片网站| 黄色片视频在线免费观看| 国产一区二区三区av电影| 精品人妻无码一区二区三区| 洋洋成人永久网站入口| 中文字幕你懂的| 日韩国产欧美区| 久久av色综合| 91在线中文字幕| 日韩成人精品一区| 青青草原成人网| 成人黄色小视频在线观看| 天天操天天操天天操天天操天天操| 色香蕉久久蜜桃| 性xxxx搡xxxxx搡欧美| 久久成人亚洲精品| 欧美亚洲二区| 视频一区二区三区在线观看| 国产欧美日韩一级| 日本一区二区在线观看视频| 一区二区三区在线播放| 国产一区二区三区黄片| 在线视频亚洲欧美| 亚洲伦乱视频| 欧美精品国产精品久久久| 亚洲激情不卡| 国产精品亚洲一区二区无码| 亚洲精品中文在线影院| 国产三级按摩推拿按摩| 色偷偷888欧美精品久久久| 免费高清视频在线一区| 麻豆久久久9性大片| 国产一区二区三区久久| 国模私拍在线观看| 亚洲国产wwwccc36天堂| 国精产品一品二品国精品69xx| 欧美成在线观看| 综合激情网...| 日本久久久网站| 国产91露脸合集magnet| 久久久久久久黄色| 精品国产人成亚洲区| sm捆绑调教国产免费网站在线观看| 粉嫩高清一区二区三区精品视频| 欧美精品麻豆| 国产伦精品一区二区免费| 天天色综合天天| 全色精品综合影院| 国产精品第一页在线| 四季av一区二区凹凸精品| 婷婷激情5月天| 一级中文字幕一区二区| 丰满人妻一区二区三区四区53 | 色播视频在线播放| 亚洲精品大尺度| 91精品xxx在线观看| 一区二区在线观看网站| 国产呦精品一区二区三区网站| 精品欧美一区二区久久久久| 精品国产电影一区二区| 黄在线观看免费网站ktv| 免费不卡亚洲欧美| 久久99精品久久久久久久久久久久 | 久久看人人摘| 国产亚洲色婷婷久久| 亚洲电影在线免费观看| 精品亚洲成a人片在线观看| 国产原创欧美精品| 在线播放亚洲| 日韩人妻一区二区三区| 欧美性猛交一区二区三区精品| 黄网站app在线观看| 精品国产综合久久| 日本最新不卡在线| 午夜精品福利在线视频| 亚洲精品国产福利| 伊人国产精品| 国产69精品久久久久久久| 欧美激情在线观看视频免费| www.热久久| 国产精品国产自产拍高清av水多 | 成人资源在线| 午夜免费一区二区| 一区二区三区中文字幕| 毛片网站在线观看| 成人免费福利视频| 香蕉久久a毛片| 爱爱视频免费在线观看| 亚洲男人的天堂在线| 成人豆花视频| 日本成年人网址| 亚洲少妇30p| 免费在线黄色网址| 亚洲影影院av| 日韩制服丝袜先锋影音| 久久精品免费av| 深夜福利日韩在线看| 奇米777国产一区国产二区| 99中文字幕在线| 在线免费不卡视频| 97超碰免费在线|