国产探花免费观看_亚洲丰满少妇自慰呻吟_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();        }    }}

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长丰县| 翼城县| 北宁市| 桃园市| 榕江县| 高要市| 三原县| 虞城县| 昌平区| 原阳县| 西和县| 漳平市| 广安市| 巩留县| 新晃| 新巴尔虎右旗| 广东省| 静安区| 武宁县| 惠安县| 涟水县| 秀山| 江都市| 疏附县| 垦利县| 鹤岗市| 兴海县| 奉贤区| 友谊县| 鄂伦春自治旗| 长武县| 广东省| 常山县| 汨罗市| 长葛市| 四子王旗| 册亨县| 东光县| 封开县| 宜州市| 洛浦县|