国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

最佳算法實現對泛型集合的數據去重

2019-11-14 13:31:17
字體:
來源:轉載
供稿:網友

我負責運維的機票差旅分析報告項目, 分析報告所需的數據(訂單數據和基礎維度數據)是從業務庫抽取過來的。 其中,有一個用戶賬戶數據的同步程序, 今天查看線上日志,發現同步程序出現了異常:

執行ExecuteSqlCommand方法捕獲到System.Data.SqlClient.SqlException異常:違反了 PRIMARY KEY 約束“PK_BASEUSERACCOUNT”。不能在對象“dbo.BaseUserAccount”中插入重復鍵。重復鍵值為 (105487)。違反了 PRIMARY KEY 約束“PK_BASEUSERACCOUNT”。不能在對象“dbo.BaseUserAccount”中插入重復鍵。重復鍵值為 (105488)。語句已終止。語句已終止。,SQL:insert BaseUserAccount(AccountId,AccountName,LoginName,EntId,EntName,DeptId,DeptName,CreateTime)values(74188,'薛彥','薛彥',49261,'太極計算機股份有限公司-智慧城市SBU部門一',49265,'銷售部','2016/1/19 16:11:23');insert BaseUserAccount(AccountId,AccountName,LoginName,EntId,EntName,DeptId,DeptName,CreateTime)values(74205,'徐琳','徐琳',49261,'太極計算機股份有限公司-智慧城市SBU部門一',49265,'銷售部','2016/1/19 16:11

程序底層是用EF實現的,賬戶同步的邏輯是把數據從數據源讀取過來放到一個List集合里,然后在本地系統持久化時,先清空表,再將List的數據轉換后分批插入。 通過分析,是從數據源拿的數據里有重復的數據,導致這邊插入時出現主鍵沖突。

 

數據源系統的數據存儲比較亂,我們改變不了。只能在我們這邊做文章了。 于是,決定的改進方案是:根據AccountId對集合數據去重。

我跟開發小組的一個同學說了一下,并叮囑,從數據源獲取到的記錄有6萬多條,注意優化一下去重算法。如果按常規的去重,估計要耗時5分鐘,期望優化后能控制在半分鐘內。

第二天,這個小同學交活了。 6萬條記錄的List集合,算法耗時平均不超過15毫秒。 贊一個!

他的實現方案是,利用List的Distinct方法,然后重寫了實體類的Equals方法。如下上代碼:

namespace EntOlap.ETL.EF{    public partial class BaseUserAccount // 由于是EF,這里新建一個partial類    {        public override bool Equals(object obj)        {            BaseUserAccount bua = obj as BaseUserAccount;            if (bua == null)            {                return false;            }            else            {                return this.AccountId == bua.AccountId;            }        }        public override int GetHashCode()        {            return AccountId.GetHashCode();        }    }}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 会东县| 汉中市| 长寿区| 亚东县| 枣阳市| 江源县| 夏津县| 中宁县| 鄂尔多斯市| 含山县| 枞阳县| 迭部县| 新营市| 临湘市| 涞水县| 邹平县| 延吉市| 昌平区| 姚安县| 湘潭市| 二手房| SHOW| 麻栗坡县| 宜川县| 桃江县| 明溪县| 邹城市| 博兴县| 香港| 浙江省| 祁阳县| 长兴县| 雅江县| 瑞金市| 正定县| 柘荣县| 遂溪县| 景泰县| 西贡区| 互助| 仙居县|