我有一个Foreach循环,每次迭代都会将记录放入系统中。然后我还有一个foreach循环,它从linqQuery获取数据。我想迭代每一个并比较每个的FullName,如果它的真实,它使bool为true,如果不是,则将其标记为false。我该怎么做呢这是我到目前为止所做的。
foreach (Lead p in sessionleads)
{
string AccountName = "";
string AccountId = "";
string ContactId = "";
bool b = false;
foreach (var a in linqQuery)
{
AccountName = a.AccountName.ToString();
AccountId = a.AccountId.ToString();
ContactId = a.ContactId.ToString();
if (AccountName.ToString() == p.AccountName.ToString())
{
b = true;
}
else
{
b = false;
}
}
if (b == true)
{
Entity opportunity = new Entity("opportunity");
opportunity["new_contact"] = new EntityReference("contact", new Guid(ContactId));
opportunity["customerid"] = new EntityReference("account", new Guid(AccountId));
opportunity.FormattedValues["new_leadstatus"] = p.Status;
opportunity.FormattedValues["statuscode"] = p.Type;
//opportunity["ownerid"] =
Guid opportunityId = orgService.Create(opportunity);
}
else
{
Entity opportunity = new Entity("opportunity");
opportunity["new_contact"] = new EntityReference("contact", contactId);
opportunity["customerid"] = new EntityReference("account", accountId);
opportunity.FormattedValues["new_leadstatus"] = p.Status;
opportunity.FormattedValues["statuscode"] = p.Type;
//opportunity["ownerid"] =
Guid opportunityId = orgService.Create(opportunity);
}
}
谢谢!
答案 0 :(得分:2)
第一次检查后添加休息时间:
if (AccountName.ToString() == p.AccountName.ToString())
{
b = true;
break;
...
更好:
var item = (from i in linqQuery
where i.AccountName == p.AccountName
select i).FirstOrDefault();
bool found = (item != null);
if(found)
{
....
}
else
{
....
}
然后,用它来进行其余的逻辑检查。
答案 1 :(得分:1)
简短的回答 - @Ingenu是对的。您只是错过了break
个关键字。但是,您可能需要考虑其他一些重构来稍微收紧代码。
这是第一次通过,保持大致相同的结构。免责声明:这是用记事本编码的 - 不保证甚至编译......
foreach (var p in sessionLeads)
{
Guid AccountId = accountId;
Guid ContactId = contractId;
foreach (var a in linqQuery)
{
if (a.AccountName == p.AccountName)
{
AccountId = new Guid(a.AccountId);
ContactId = new Guid(a.ContactId);
break;
}
}
Entity opportunity = new Entity("opportunity");
opportunity["new_contact"] = new EntityReference("contact", ContactId);
opportunity["customerid"] = new EntityReference("account", AccountId);
opportunity.FormattedValues["new_leadstatus"] = p.Status;
opportunity.FormattedValues["statuscode"] = p.Type;
orgService.Create(opportunity);
}
第一次通过的几个关键点......
contractId
和accountId
(以小写字母开头)。我认为他们是guids。AccountName
,AccountId
等AccountName
变量。AccountName
和ContactId
变量名称,但大多数人都使用小写字母启动局部变量。break
退出循环。opportunity
代码都与b == true
和b == false
重复。尽量不这样做,这会使维护变得困难。很多时候,可以通过将代码位提取到一个小的,集中的方法(如CreateOpportunity(...)
)来修复重复。不要害怕使方法变小。 通过第二名。同样的免责声明......
foreach (var p in sessionLeads)
{
var match = linqQuery.FirstOrDefault(x => x.AccountName == p.AccountName);
Guid AccountId = (match != null ? new Guid(match.AccountId) : accountId);
Guid ContactId = (match != null ? new Guid(match.ContractId) : contractId);
Entity opportunity = new Entity("opportunity");
opportunity["new_contact"] = new EntityReference("contact", ContactId);
opportunity["customerid"] = new EntityReference("account", AccountId);
opportunity.FormattedValues["new_leadstatus"] = p.Status;
opportunity.FormattedValues["statuscode"] = p.Type;
orgService.Create(opportunity);
}
for
循环。 Linq扩展方法 - 学习它们,爱它们,它们是你最好的朋友。 Linq Join
可能会更进一步,但我认为此时此刻非常紧张。我和我需要睡觉。希望这对你有用!