C# 分组未按预期工作,返回的电子邮件超过预期数量

C# 分组未按预期工作,返回的电子邮件超过预期数量,c#,C#,我有一个包含23个交易的销售订单表,它们被分配到部门1或部门2。我查看了数据,并且根据类别名称有权分配给它。但是问题在于我对循环的理解,因为我收到了23封电子邮件,而不是5封销售订单电子邮件,这是应该的 比如说,这个表是 SalesOrder Number Depart 1111 1 1111 2 2222 2 2222 2 我应该收到一封销售订单1111的电子邮件发送到部门1,

我有一个包含23个交易的销售订单表,它们被分配到部门1或部门2。我查看了数据,并且根据类别名称有权分配给它。但是问题在于我对循环的理解,因为我收到了23封电子邮件,而不是5封销售订单电子邮件,这是应该的

比如说,这个表是

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);
            }
        }