protected void btnActiveFriends_Click(object sender, EventArgs e) { int Friend = 1; int PersonalFriend = 2; int days = 30; Int32.TryParse(txtDays.Text, out days); var members = (from p in db.CRM_AnnualPasses let FormFieldResponses = db.CRM_FormFieldResponses.Where(r => r.TargetReference == p.PrimaryContactReference) let IsFriendByConstituent = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == Friend)) let IsPersonalFriend = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == PersonalFriend)) let Person = db.CRM_Persons.First(r => r.Reference == p.PrimaryContactReference) where p.ExpiryDate >= DateTime.Now.Date.AddDays(-days) where p.StartDate <= DateTime.Now.Date where Person.IsDeceased == false where Person.IsDoNotMail == false where Person.IsArchived == false select new CRM.Code.Helpers.FriendReportHelper() { CRM_AnnualPass = p, IsFriend = IsFriendByConstituent.Any(), IsPersonalFriend = IsPersonalFriend.Any(), CRM_Person = Person }).ToList(); members = members.ToList(); var PersonalFriendsWithoutPasses = (from p in db.CRM_Persons let FormFieldResponses = db.CRM_FormFieldResponses.Where(r => r.TargetReference == p.Reference) let IsFriendByConstituent = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == Friend)) let IsPersonalFriend = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == PersonalFriend)) where p.IsDoNotMail == false where p.IsDeceased == false where IsPersonalFriend.Any() where p.IsArchived == false select new CRM.Code.Helpers.FriendReportHelper() { CRM_AnnualPass = null, IsFriend = IsFriendByConstituent.Any(), IsPersonalFriend = IsPersonalFriend.Any(), CRM_Person = p }).ToList(); PersonalFriendsWithoutPasses = (from p in PersonalFriendsWithoutPasses where !members.Any(m => m.CRM_Person.Reference == p.CRM_Person.Reference) select p).ToList(); members = members.Concat(PersonalFriendsWithoutPasses).Where(r => r.CRM_Person.Address1 != "").ToList(); if (chkExhibition.Checked) { var constituents = ExhibitionPostals(); var dataset = from p in (from p in db.CRM_Persons let FormFieldResponses = db.CRM_FormFieldResponses.Where(r => r.TargetReference == p.Reference) let IsFriendByConstituent = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == Friend)) let IsPersonalFriend = (FormFieldResponses.Where(r => r.CRM_FormFieldItemID == PersonalFriend)) where !p.IsArchived where db.CRM_FormFieldResponses.Any(r => r.CRM_FormFieldItemID != null && constituents.Contains((int)r.CRM_FormFieldItemID) && r.TargetReference == p.Reference) where !p.IsDoNotMail select new CRM.Code.Helpers.FriendReportHelper() { CRM_AnnualPass = null, IsFriend = IsFriendByConstituent.Any(), IsPersonalFriend = IsPersonalFriend.Any(), CRM_Person = p }).ToList() select p; members = members.Concat(dataset).ToList(); } IEnumerable <IGrouping <int?, FriendReportHelper> > groupset = members.GroupBy(g => g.CRM_Person.RelationshipID); var recordsWithRelation = groupset.Where(c => c.Key != null).Select(c => c.First()); var recordsWithoutRelation = groupset.Where(c => c.Key == null).SelectMany(c => c); members = recordsWithRelation.Concat(recordsWithoutRelation).ToList(); IEnumerable <IGrouping <string, FriendReportHelper> > addressGroupset = members.GroupBy(g => g.CRM_Person.CRM_Address.FormattedAddress); var recordsWithAdress = addressGroupset.Where(c => c.Key != null).Select(c => c.First()); var recordsWithoutAddress = addressGroupset.Where(c => c.Key == null).SelectMany(c => c); members = recordsWithAdress.Concat(recordsWithoutAddress).ToList(); IEnumerable <IGrouping <string, FriendReportHelper> > fullnamePostcode = members.GroupBy(g => g.CRM_Person.CRM_Address.Postcode + g.CRM_Person.Fullname); members = fullnamePostcode.Select(c => c.First()).ToList(); CSVExport.ActiveFriendsByConstituent(members, Response); }