2015-10-15 4 views
2

, что я пытаюсь сделать,Могу ли я объединить эти два списка в 1 идут

// get members from SharePoint list (can be null) 
// get members from database (can be null) 
// merge database members with sharepoint list members BUT only database members should have property VIP = true 
// by merge I mean if they are not in list then add them to list, if they are in list then just change there property VIP = true 
// by default VIP property is false 

То, что я разработал до сих пор,

List<Member> Members = new List<Member>(); 
     foreach (SPListItem mItem in GetList(Url).Items) 
     { 
      Member m = new Member(); 
      m.ID = mItem.ID; 
      m.Name = mItem.Title; 
      m.Company = Utilities.ObjectToStringOrEmpty(mItem[companyCol]); 
      m.eMail = Utilities.ObjectToStringOrEmpty(mItem[emailCol]); 
      m.Comment = Utilities.ObjectToStringOrEmpty(mItem[commentCol]); 
      m.Membership = Utilities.ObjectToStringOrEmpty(mItem[msCol]); 
      Members.Add(m); 
     } 

     var cd = new MemberManager().GetMoreMembers(Url + "/"); 
     var activeMembers = cd.Where(am => am.MembershipStatus == "Active" || am.MembershipStatus == "Pending").ToList(); 
     if (activeMembers != null || activeMembers.Count() > 0) 
     { 
      foreach (var am in activeMembers) 
      { 
       if (!Members.Any(a => a.eMail.ToLowerInvariant() == am.Email.ToLowerInvariant())) 
       { 
        Member m = new Member(); 
        m.Name = am.FirstName + " " + am.LastName; 
        m.eMail = am.Email; 
        m.IsVip = true; 
        Members.Add(m); 
       } 
      } 
     } 

     md.Members = Members.ToArray(); 

Проблема

Могу ли я использовать Linq и объединить эти списки за один раз? Может быть, что-то вроде этого, псевдо бы

var dbMembers = //GetDBMembers that are active or pending 

var spMembers = 
       Select all members using `.Cast<SPListItem>()` 
       If spMembers has any dbMember (compared by email) 
       Then change that spMembers VIP property to true (which is by default false) 
       For rest dbMembers that doesn't exists in spMembers, add them with VIP property = true 

Не знаю, как я могу эффективно ставить выше псевдокоде в LINQ

+0

Почему вы не хотите использовать linq? У меня есть идея, как это сделать, но с помощью Linq. –

+0

@ DawidPawłowski извините за замешательство, я хочу использовать linq, спасибо – Mathematics

ответ

0

Да вы можете. Используйте Enumerable.Concat method, чтобы объединить два списка в один.

Если вы разделяете из кода для создания объектов-членов на два метода, один MemberFromSpListItem и один MemberFromActiveMember, то вы получите следующее относительно хороший код:

var cd = new MemberManager().GetMoreMembers(Url + "/"); 
    var activeMembers = cd.Where(am => am.MembershipStatus == "Active" || am.MembershipStatus == "Pending").ToList(); 

    var members = GetList(Url) 
        .Items 
        .Select(MemberFromSpListItem) 
        .Concat(activeMembers.Select(MemberFromActiveMember)) 
        .ToList(); 
1

Попробуйте это:

var allSpMembers = GetSpList(); // get your members as you mentioned before by `.Cast<SPListItem>()` 

List<SPListItem> spMembers = 
    dbMembers.GroupJoin(allSpMembers, dbM => dbM.Email, spM => spM.Email, 
     (dbMember, spMember) => new { dbMember, spMember }) 
      .SelectMany(x => x.spMember.DefaultIfEmpty(), (x, spMember) => 
       { 
        SPListItem yourSpListItem; 

        if (spMember != null) 
        { 
         yourSpListItem = spMember; 
        } 
        else 
        { 
         yourSpListItem = x.dbMember; //make some mapping here to SPListItem model 
        } 

        yourSpListItem.VIP = true; 

        return yourSpListItem; 
       }).ToList(); 
Смежные вопросы