C# 分组未按预期工作,返回的电子邮件超过预期数量
我有一个包含23个交易的销售订单表,它们被分配到部门1或部门2。我查看了数据,并且根据类别名称有权分配给它。但是问题在于我对循环的理解,因为我收到了23封电子邮件,而不是5封销售订单电子邮件,这是应该的 比如说,这个表是C# 分组未按预期工作,返回的电子邮件超过预期数量,c#,C#,我有一个包含23个交易的销售订单表,它们被分配到部门1或部门2。我查看了数据,并且根据类别名称有权分配给它。但是问题在于我对循环的理解,因为我收到了23封电子邮件,而不是5封销售订单电子邮件,这是应该的 比如说,这个表是 SalesOrder Number Depart 1111 1 1111 2 2222 2 2222 2 我应该收到一封销售订单1111的电子邮件发送到部门1,
SalesOrder Number Depart
1111 1
1111 2
2222 2
2222 2
我应该收到一封销售订单1111的电子邮件发送到部门1,一封发送到部门2,但在2222的情况下,我应该收到一封电子邮件,包括所有2222
我认为问题在于小组不知道如何分批,我在问做这件事的最佳方式是什么
public void ProcessTransactions(string csvFileName)
{
var engine = new FileHelperEngine<SalesOrderHeader>();
var SalesOrders = engine.ReadFile(csvFileName);
var engine2 = new FileHelperEngine<SalesOrdersLines>();
var OrderLines = engine2.ReadFile(csvFileName);
GetSalesOrdersForImport();
ImportTransActions(SalesOrders.ToList());
CreateSalesOrder(_salesOrders.ToList(), _salesOrders.ToList());
var groupedSalesOrders = SalesOrders.OrderBy(x => x.SalesOrderNumber)
.GroupBy(x => x.SalesOrderNumber);
foreach(var group in groupedSalesOrders)
{
foreach (var item in group)
{
GetEmailsFromDepartment(item.DepartmentId);
GetSalesOrdersByDepartment(item.DepartmentId);
SendEmailNotificationPerDepartments(item.SalesOrderNumber.ToString());
}
}
}
我想我只是在这里度过了一个周六的夜晚,但我希望有人能帮助我,也许我做错了什么事。可能看起来像这样:
var list = new List<Email>()
{
new Email() {SalesOrderNumber = 10, Depart = 1},
new Email() {SalesOrderNumber = 10, Depart = 2},
new Email() {SalesOrderNumber = 20, Depart = 2},
new Email() {SalesOrderNumber = 20, Depart = 2},
};
var groups = list.GroupBy(e => e.SalesOrderNumber) // sort all emails by SalesOrderNumber
.Select(g => g.GroupBy(e => e.Depart)) // sort groups by Depart
.Aggregate((l, r) => l.Concat(r)); // aggregate result to only one collection of groups
foreach (var group in groups)
{
Console.WriteLine($"Group of SalesOrderNumber: {group.First().SalesOrderNumber}, Depart: {group.Key}");
foreach (var email in group)
{
Console.WriteLine(email);
}
}
var list=新列表()
{
新电子邮件(){SalesOrderNumber=10,Deep=1},
新电子邮件(){SalesOrderNumber=10,Depart=2},
新建电子邮件(){SalesOrderNumber=20,Depart=2},
新建电子邮件(){SalesOrderNumber=20,Depart=2},
};
var groups=list.GroupBy(e=>e.SalesOrderNumber)//按SalesOrderNumber对所有电子邮件进行排序
.Select(g=>g.GroupBy(e=>e.Depart))//按Depart对组进行排序
.骨料((l,r)=>l.Concat(r));//仅将结果聚合到一个组集合
foreach(组中的var组)
{
WriteLine($“SalesOrderNumber组:{Group.First().SalesOrderNumber},Depart:{Group.Key}”);
foreach(组中的var电子邮件)
{
控制台。WriteLine(电子邮件);
}
}
group by函数groups by key,不关心该分组的order by,因此您应该获得1111的所有电子邮件和2222的所有电子邮件。OrderBy函数仅用于对该组中的值进行排序。你想要的东西可以通过两次调用GroupBy来实现。你能用一个例子来解释一下吗
SAPbobsCOM.UserTable sboTable = (SAPbobsCOM.UserTable)company.UserTables.Item("DEPARTMENTS");
SAPbobsCOM.BusinessPartners sboBP = (SAPbobsCOM.BusinessPartners)company.GetBusinessObject(SAPbobsCOM.BoObjectTypes.oBusinessPartners);
string emailAddressCC = ConfigurationManager.AppSettings["EmailAddressTo"];
string body;
string stmpServer = ConfigurationManager.AppSettings["SmtpAddress"];
string EmailUserName = ConfigurationManager.AppSettings["EmailUserName"];
string EmailPassword = ConfigurationManager.AppSettings["EmailPassword"];
string SmtpPort = ConfigurationManager.AppSettings["SmtpPort"];
MailMessage Msg = new MailMessage();
Msg.From = new MailAddress("development@test.com");
Msg.IsBodyHtml = true;
Msg.Subject = "Sales Orders Created in SAP";
body = "Sales orders has been imported into sap";
StringBuilder sb = new StringBuilder();
using (Html.Table table = new Html.Table(sb, id: "some-id"))
{
table.StartHead();
using (var thead = table.AddRow())
{
thead.AddCell("Works Order Number");
thead.AddCell("Purchase Order Number");
thead.AddCell("Date Required");
thead.AddCell("Stock Item Code");
thead.AddCell("Stock Item Name");
thead.AddCell("Customer");
}
table.EndHead();
table.StartBody();
foreach (var order in SalesOrders.Where(w=>w.DepartmentId == DepartmentId && w.SalesOrderNumber ==salesOrderId).OrderBy(o=>o.SalesOrderNumber))
{
using (var tr = table.AddRow(classAttributes: "someattributes"))
{
tr.AddCell(order.WorksOrderNumber, "style:font-bold;");
tr.AddCell(order.PurchaseOrderNumber.ToString());
tr.AddCell(order.DateRequired.ToString());
tr.AddCell(order.ItemCode.ToString());
tr.AddCell(order.Description.ToString());
if(sboBP.GetByKey(order.CardCode))
{
sboBP.CardName.ToString();
}
}
}
}
foreach (var address in _emailListsByDepartment)
{
Msg.To.Add(address.Email);
}
foreach (var address in emailAddressCC.Split(new[] { ";" }, StringSplitOptions.RemoveEmptyEntries))
{
Msg.CC.Add(address);
}
body = body + Environment.NewLine + sb.ToString();
Msg.Body = body;
SmtpClient smtp = new SmtpClient(stmpServer);
smtp.Credentials = new NetworkCredential(EmailUserName, EmailPassword);
smtp.Host = stmpServer;
smtp.Port = Convert.ToInt16(SmtpPort);
smtp.Send(Msg);
}
catch (Exception ex)
{
log.Error("Error has occoured at the send email notification " + ex.ToString());
}
}
var list = new List<Email>()
{
new Email() {SalesOrderNumber = 10, Depart = 1},
new Email() {SalesOrderNumber = 10, Depart = 2},
new Email() {SalesOrderNumber = 20, Depart = 2},
new Email() {SalesOrderNumber = 20, Depart = 2},
};
var groups = list.GroupBy(e => e.SalesOrderNumber) // sort all emails by SalesOrderNumber
.Select(g => g.GroupBy(e => e.Depart)) // sort groups by Depart
.Aggregate((l, r) => l.Concat(r)); // aggregate result to only one collection of groups
foreach (var group in groups)
{
Console.WriteLine($"Group of SalesOrderNumber: {group.First().SalesOrderNumber}, Depart: {group.Key}");
foreach (var email in group)
{
Console.WriteLine(email);
}
}