C# linq查询提供参数的并行处理

C# linq查询提供参数的并行处理,c#,multithreading,linq-to-sql,entity-framework-6,parallel.foreach,C#,Multithreading,Linq To Sql,Entity Framework 6,Parallel.foreach,我需要并行处理这些进程,但我没有关于c中并行进程的任何信息。我尝试过不同的方法,但都失败了。每一部分都同样失败了 以下是我获取堆栈跟踪的错误: 在System.Data.Entity.Internal.Linq.InternalSet1.get_表达式中 在WebAPI.BLL.Comms.CommsBusinessLayer.c_uu中,显示D:\API ComposeComms\WebAPI.BLL\Comms\CommsBusinessLayer.cs中的Class2_0.b_uu3联系人

我需要并行处理这些进程,但我没有关于c中并行进程的任何信息。我尝试过不同的方法,但都失败了。每一部分都同样失败了

以下是我获取堆栈跟踪的错误:

在System.Data.Entity.Internal.Linq.InternalSet1.get_表达式中 在WebAPI.BLL.Comms.CommsBusinessLayer.c_uu中,显示D:\API ComposeComms\WebAPI.BLL\Comms\CommsBusinessLayer.cs中的Class2_0.b_uu3联系人组:第61行 在System.Threading.Tasks.Parallel.c__显示屏上Class17_01.b__1

信息是

对象引用未设置为对象的实例


为什么你需要同时做呢?这可能是一个XY问题,并且误解了并行DB工作负载将实现什么。我的api加载速度慢,因为它需要花很长时间来处理。管理者告诉我要用13秒的时间将其缩短到3秒以下。98.234324%的时间里,针对数据库的并行处理并不能解决性能问题。这就像说我的车慢了,我最好多修路。您需要处理实际的查询,找出瓶颈在哪里,您可以通过查看生成的sql来实现这一点,根据DBActualy查询对其进行分析正常工作,但由于必须在for循环api中多次调用,因此加载速度较慢。因此,与其使用where x==y,不如尝试在y中创建where x,以便只有一个查询,而不是多个查询。在linq中,您可以使用.Contains执行此操作
            List<ContactGroup> contactGroups = new List<ContactGroup>();
            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();
            contactGroups.AddRange(dbEnt.ClientContactGroups.Where(x => x.ClientID == ClientID && x.IsDeleted == false).Select(x => new ContactGroup { ClientID = x.ClientID, ClientContactGroupID = x.ClientContactGroupID, ContactGroupName = x.ContactGroupName }).ToList());
            stopwatch.Stop();
            if (!string.IsNullOrEmpty(SearchText))
            {
                contactGroups.Where(x => x.ContactGroupName.Contains(SearchText)).ToList();
            }
            List<SP_GroupContacts_Result> groupContacts_Results = new List<SP_GroupContacts_Result>();
            stopwatch.Start();
            Parallel.ForEach(contactGroups, groups =>
            {
                groups.Contacts = new List<Contact>();
                groups.Contacts.AddRange((from cc in dbEnt.ClientContacts
                        join rt in dbEnt.ResponseTeamUserMappings on cc.ClientContactID equals rt.CMTMemberUserID
                        join cr in dbEnt.ClientRoles on rt.ClientRoleID equals cr.ClientRoleID
                        where cc.ClientContactGroupID == groups.ClientContactGroupID && cc.IsActive == true && cc.IsDeleted == false
                        select new Contact
                        {
                            ClientContactID= cc.ClientContactID,
                            FirstName = cc.FirstName,
                            LastName = cc.LastName,
                            ProfileImage = cc.ProfileImage,
                            RoleName = cr.ClientRoleName,
                            Email= cc.Email,
                            ContactNumber= cc.MobilePhone
                        }).ToList());
            });
            stopwatch.Stop();