在將實體保存到數據庫之前,我需要檢查重複條目。以下是我目前的代碼在性能方面,檢查重複實體的好方法
if (db.Product.Any(x => x.Code == entity.Code))
{
error.Add('Duplicate code');
}
if (db.Product.Any(x => x.Name == entity.Name))
{
error.Add('Duplicate name');
}
if (db.Product.Any(x => x.OtherField == entity.OtherField))
{
error.Add('Duplicate other field');
}
上面的代碼的問題是,它使3分貝調用來驗證實體。這個表格有數百萬條記錄,這個應用程序將被千用戶使用。所以這會嚴重損害業績。我可以讓它一個查詢雖然
if (db.Product.Any(x => x.Code == entity.Code || x.Name == entity.Name || x.OtherField == entity.OtherField))
{
error.Add('Duplication found');
}
第二個代碼的問題是,我不知道哪個字段是重複的。
這樣做的更好方法是什麼?我應該只依賴於數據庫中的唯一約束嗎?然而,來自數據庫的錯誤是醜陋的。
編輯
我需要顯示所有的錯誤給用戶如果超過1個重複的領域。 考慮這種情況:如果重複字段是代碼和名稱。如果我告訴用戶代碼已經存在,那麼他會更改代碼並嘗試再次保存它。然後顯示第二個錯誤(名稱字段)。在成功保存之前,它使用戶保存了幾次。
我非常喜歡這種方法。但你覺得這個表現怎麼樣?沒有計數掃描表中的所有記錄? – Reynaldi
大多數數據庫引擎都針對計數進行了優化,但「Any」通常更好,因爲它停止在找到的第一條記錄。 –
@Reynaldi您需要在'Products'表中爲'Name','Code'和'OtherField'字段創建索引,然後SQL可以在O(log N)時間內對行進行計數。 –