我正在使用动态soql使用以下方法对联系人记录进行相当简单的查询:
public PageReference contactSearch() {
contactResultSetSize = 0;
if(!String.isEmpty(firstname) || !String.isEmpty(lastname) || !String.isEmpty(company)) {
string soql = 'Select firstname, lastname, account.Name, account.BillingStreet, account.BillingCity, account.BillingState, account.BillingPostalCode From Contact';
String whereClause = '';
if(!String.isEmpty(firstname)) {
whereClause = ' Where firstname like \'%' + firstname + '%\'';
}
if(!String.isEmpty(lastname)) {
if(!String.isEmpty(firstname)) {
whereClause += ' AND lastname like \'%' + lastname + '%\'';
}
else {
whereClause = ' Where lastname like \'%' + lastname + '%\'';
}
}
if(!String.isEmpty(company)) {
if(!String.isEmpty(firstname) || !String.isEmpty(lastname)) {
whereClause += ' AND account.Name like \'%' + company + '%\'';
}
else {
whereClause = ' Where account.Name like \'%' + company + '%\'';
}
}
soql = soql + whereClause;
List<Contact> searchResults = Database.query(soql);
contactResultSetSize = searchResults.size();
if(contactLinesForPage == null) {
contactLinesForPage = new List<ContactWrapper>();
}
for(Contact c : searchResults) {
contactLinesForPage.add(new ContactWrapper(contactLinesForPage.size(), c, ''));
}
}
return null;
}
我正在使用包装器类,contactLinesForPage是我的包装器对象的列表:
public List<ContactWrapper> contactLinesForPage {get; set;}
当用户进行多次搜索时,我不想将记录重新添加到searchResults列表中。如何检查对象中是否已存在记录,以便在搜索中没有返回重复记录?
感谢您的帮助。
答案 0 :(得分:2)
或者您可以使用地图。将ContactWrapper对象添加到地图中。地图的关键是一个id。如果他们添加了重复的联系人,它将只覆盖已存在的联系人。你的代码就是
aMap.put(cw.id, cw); // one line eliminates duplicates.
如果需要ContactWrappers列表,只需返回aMap.values();
如果要抽象维护联系人集合的行为,请创建一个ContactCollection类并在其中隐藏实现。这将为类似的情况提供更多可重复使用的东西以及良好的模式。
答案 1 :(得分:1)
如果contactLinesForPage已经包含此联系人,请添加一项检查。像这样:
for(Contact c : searchResults) {
Boolean toInsert = true;
for(ContactWrapper cw : contactLinesForPage){
if(cw.contact.Id == c.Id){
toInsert=false;
}
}
if(toInsert){
contactLinesForPage.add(new ContactWrapper(contactLinesForPage.size(), c, ''));
}
}