我想通知接受者我们这周有新合同。在我发送电子邮件后,有关发送合同的信息存储在MS数据库中。
为了避免有人成为关于合同的同一封电子邮件,我多次执行以下步骤:
在此之后,我从输入集合中删除已经在已发送集合中的契约:
public Collection<Contract> GiveContractsThatWereNotSent(Collection<Contract> newThisWeekContracts)
{
var contractsWereSent = new Collection<Contract>();
using (var accountingEntities = new AccountingEntities())
{
foreach (Contract newContract in newThisWeekContracts)
{
bool found = (from sent in accountingEntities .Tbl_SentProtocol
where
sent.CONTRACT_NO == newContract.ContractNo
&& sent.CONTRACT_NO_ALT == newContract.ContractNoAlt
select sent ).Any();
if (found)
{
contractsWereSent.Add(newContract);
}
}
}
foreach (Contract contract in contractsWereSent)
{
newThisWeekContracts.Remove(contract);
}
return newThisWeekContracts;
}发布于 2014-04-29 15:35:37
有几点:
Collection是一个特定的实现。newThisWeekContracts专门成为一个Collection。我会接受任何IEnumerable<Contract>而不是。Collection,调用方可以添加或删除它,这可能不是预期的行为。我将返回一个IEnumerable<Contract>,或者,如果添加/删除是可以的,我将返回一个IList<Contract>或<ICollection<Contract> (即抽象,而不是特定的实现)。似乎可以减少查询的数量,但我认为它消耗的资源较少;主要是根据需要将.Where()与.Any()和!.Any()相结合:
public IEnumerable<Contract> GiveContractsThatWereNotSent(IEnumerable<Contract> newContracts)
{
using (var entities = new AccountingEntities())
{
var sentContracts =
entities.Tbl_SentProtocol
.Where(sent =>
newContracts.Any(contract =>
sent.CONTRACT_NO == contract.ContractNo
&& sent.CONTRACT_NO_ALT == contract.ContractNoAlt))
.ToList();
}
// ...
}这给您发送了合同(/ contractsWereSent),但这不是您想要的。现在,您需要返回newContracts (/ newThisWeekContracts)中没有在sentContacts中的契约。
你所拥有的:
foreach (Contract contract in contractsWereSent)
{
newThisWeekContracts.Remove(contract);
}包括打电话EqualityComparer.Default在每一个contract,它验证Contract是否实现了IEquatable<T>,否则如果Contract重写了它们,则使用.Equals和.GetHashCode的重写,否则使用引用相等.这听起来不太好,因为如果一个契约是“相等”的,当它的ContractNo和ContractNoAlt在sendContracts中存在时,当在Tbl_SentProtocol中进行比较时,当我想从newContracts中“删除”项时,我会使用相同的相等比较。
事实上,我不会从newContracts中删除任何东西。为输入保留输入!
这个怎么样?
IEnumerable<Contract> sentContracts;
using (var entities = new AccountingEntities())
{
sentContracts = // trying to prevent horizontal scrolling...
entities.Tbl_SentProtocol
.Where(sent =>
newContracts.Any(contract =>
sent.CONTRACT_NO == contract.ContractNo
&& sent.CONTRACT_NO_ALT == contract.ContractNoAlt))
.ToList();
}
return newContracts.Where(contract => !sentContracts.Any(sent =>
sent.CONTRACT_NO == contract.ContractNo
&& sent.CONTRACT_NO_ALT == contract.ContractNoAlt))
.ToList();还有一件事是,应该命名实体,以便像普通代码一样读取--实体类型SentContract可以映射到表tbl_SentProtocol,属性ContractNumber和ContractAltNumber可以映射到列CONTRACT_NO和CONTRACT_NO_ALT ;)
https://codereview.stackexchange.com/questions/48477
复制相似问题