Salesforce apex代码在自定义对象中创建重复项

Salesforce apex代码在自定义对象中创建重复项,salesforce,apex,Salesforce,Apex,我有这样一门课程: 下面的MDU_Squad_Data_min___c自定义对象在“城市和省”列中有许多重复值。 通过下面的代码,我在某种程度上可以借助contains方法消除重复的值,但仍然存在重复的值: global void execute(Database.BatchableContext BC, List<MDU_Squad_Data_min__c> cities) { List<sumchans__City_Mas

我有这样一门课程: 下面的MDU_Squad_Data_min___c自定义对象在“城市和省”列中有许多重复值。 通过下面的代码,我在某种程度上可以借助contains方法消除重复的值,但仍然存在重复的值:

global void execute(Database.BatchableContext BC, List<MDU_Squad_Data_min__c> cities) {                  
        List<sumchans__City_Master__c> cityList = new List<sumchans__City_Master__c>(); 
        List<String> cityProvinceList = new List<String>();
        for(MDU_Squad_Data_min__c c: cities) { 
            String cityprovince; 
            cityprovince = (c.CITY_NAME__c).trim() + (c.PROVINCE_CODE__c).trim();                                           
            if(!cityProvinceList.contains(cityprovince)) { 

                sumchans__City_Master__c city = new sumchans__City_Master__c();
                city.Name = c.CITY_NAME__c;
                city.sumchans__PROVINCE__c = c.PROVINCE_CODE__c; 
                cityList.add(city);
            }
            cityProvinceList.add(cityprovince);
        }        
        Database.SaveResult[] MySaveResult = Database.Insert(cityList, false);
global void execute(Database.BatchableContext BC,List cities){
List cityList=新列表();
List CITYPROVICELIST=新列表();
(MDU小队数据:城市){
字符串城市省;
cityprovince=(c.CITY\u NAME\u c.trim()+(c.PROVINCE\u CODE\u c.trim());
如果(!cityProvinceList.contains(cityprovince)){
sumchans________c City=新sumchans________c城市();
city.Name=c.city\u Name\u c;
city.sumchans\uuuuu PROVINCE\uuuu c=c.PROVINCE\u CODE\uuuu c;
城市列表。添加(城市);
}
城市省份列表。添加(城市省份);
}        
Database.SaveResult[]MySaveResult=Database.Insert(cityList,false);
并附上结果:
尝试使用集合而不是列表:

Set<sumchans__City_Master__c> cityList = new Set<sumchans__City_Master__c>();
Set cityList=new Set();

集合用于创建唯一的集合,这样您就不会有任何重复的集合。

我建议如下,因为List.contains主要用于字符串搜索。
全局void execute(Database.BatchableContext BC,List cities){
List cityList=新列表(); List CITYPROVICELIST=新列表();
适用于(MDU小组、数据、最小值、c:城市) { 字符串城市省; 城市省份=修剪(c.城市名称)+修剪(c.省代码)


}

您正在使用一个对象创建一个list.contains,因为您每次都创建一个新对象,但找不到匹配的对象

 global void execute(Database.BatchableContext BC, List<MDU_Squad_Data_min__c> cities) {  
List<sumchans__City_Master__c> cityList = new List<sumchans__City_Master__c>();  
Set<String> cityNames = new Set<String>();     
for(MDU_Squad_Data_min__c c: cities)
{
   if(!cityNames.contains(c.City_Name__c))
   {
     sumchans__City_Master__c city = new sumchans__City_Master__c();
     city.Name = c.CITY_NAME__c;
     city.sumchans__PROVINCE__c = c.PROVINCE_CODE__c; 
     cityList.add(city);
     cityNames.add(city.CITY_NAME__c); 
   }
}
Database.SaveResult[] MySaveResult = Database.Insert(cityList, false);
global void execute(Database.BatchableContext BC,List cities){
List cityList=新列表();
Set cityNames=new Set();
适用于(MDU小组、数据、最小值、c:城市)
{
如果(!cityNames.contains(c.City\u Name\u c))
{
sumchans________c City=新sumchans________c城市();
city.Name=c.city\u Name\u c;
city.sumchans\uuuuu PROVINCE\uuuu c=c.PROVINCE\u CODE\uuuu c;
城市列表。添加(城市);
cityNames.add(city.city\u NAME\u\c);
}
}
Database.SaveResult[]MySaveResult=Database.Insert(cityList,false);

}这就是所需要的。我现在得到了预期的结果。我只需要将第二个参数的值设置为高于记录总数的值

cityMduMaster c = new cityMduMaster();
database.executeBatch(c,5000000);

正如您所指出的,这可能是一个快速修复方法,即在给出的参数值高于记录总数时,可以获得所需的结果。

谢谢@BlakeReimer。这没有帮助,它仍然与上面的结果相同。这是我到目前为止发现的结果。我尝试创建了4个自定义对象,每个对象都有一个带有d的城市upes.City A有121条记录,当我运行上面的代码时,结果是1,City B有170条记录,结果也是1。City C有222条记录,结果是2,City D有406条记录,结果是3。我想知道这是否与批处理有关。我听说,当我们创建一个批处理类时,它会处理我输入的数据如果变量在第一批200条记录之后被重新初始化,也可以是在我执行Sytem.debug(cities.size())时,它只给了我200个,应该是292个。Pundarrekam建议的是与上面相同的东西。你需要在某个地方存储一个唯一的值进行比较。不要比较对象,你需要比较像Pundarrekam和我建议的字符串值。您好@Pundarekam,我尝试了与您提供的完全相同的代码,它对我不起作用。@Pundarek是的,我也用你给我的代码编辑了我的原始帖子。虽然没有显示任何错误,但输出结果与以前一样。我尝试了有限的数据量,只有两个城市,但我仍然得到了副本,但当我将其缩减到一个更短的列表时,我能够消除副本。这可能与数据有关吗?谢谢@P这不起作用,这和我以前得到的结果是一样的。我不知道还有什么其他方法可以让它起作用。这里也没有人能给出答案。
cityMduMaster c = new cityMduMaster();
database.executeBatch(c,5000000);