2009-04-28 8 views
3

Ich habe eine Liste von Adressen in einem übergeordneten Objekt namens Branch. Branch kann diese Adressen definiert haben oder nicht und ich muss eine flache Hierarchie oder diese Verzweigung und Adresse erhalten.LINQ: Abrufen der Parent-Objekteigenschaften und einer einzelnen untergeordneten Eigenschaft als flache Struktur

var x = from p in CurrentBranchList 
     where p.ScheduledForDeletion == false 
     from c in p.Addresses 
     where c.ScheduledForDeletion == false && c.AddressTypeId == 3 
     select new 
     { 
      BranchId = p.BranchId, 
      Name = p.Name, 
      Address = (c == null) ? "" : c.Address1 + " " + c.Address2, 
      City = (c == null) ? "" : c.City, 
      State = (c == null) ? 0 : c.StateId 
     }; 

Die oben ist, was ich versuchte, aber wenn die Adresse ich keine Informationen über die Filiale erhalten fehlt ... Ich bin immer noch versuchen, herauszufinden, wie man diese mit Linq in Gang zu bringen. In SQL hätte ich mich einfach den beiden Tabellen angeschlossen, um diese Info zu bekommen.

Kann mir jemand dabei helfen ... Ich bin sicher, es ist eine ziemlich einfache Sache. Vielen Dank. PS. Ich weiß, das ist sehr ähnlich zu (Linq query to return a flatened list of parent child), aber in diesem ein Kind existiert immer.


EDIT - Arbeitslösung Das folgende ist Code, der für mich zu arbeiten schien. Ich kann nicht gegen eine Datenbank für die Quelle gehen, weil die in der CurrentBranchList enthaltenen Objekte im Speicher bearbeitet werden und die Persistenz in einer einzigen Operation ausgeführt wird.

var x = from p in CurrentBranchList 
     join c in CurrentBranchList.SelectMany(b => b.Addresses) 
      on p.EntityId equals c.EntityId into ur 
     where p.ScheduledForDeletion == false  
     from u in ur.DefaultIfEmpty() 
     select new 
     { 
      BranchId = p.BranchId, 
      Name = p.Name, 
      Address = (u == null) ? "" : u.Address1 + " " + u.Address2, 
      City = (u == null) ? "" : u.City, 
      State = (u == null) ? 0 : u.StateId 
     }; 

Vielen Dank für Ihre Hilfe. Diese Links haben mir wirklich geholfen zu verstehen, was passieren musste.

Ich habe auch versucht Daniel Brückner Lösung und das scheint eleganter zu sein und weniger tippen erfordern. :-) Scheint in den paar Szenarien, die ich ausprobiert habe, zu arbeiten.

So sieht das aus.

var xx = CurrentBranchList.SelectMany(b => b.Addresses.DefaultIfEmpty().Select(a => new 
     { 
      BranchId = b.BranchId, 
      Name = b.Name, 
      Address = (a == null) ? "" : a.Address1 + " " + a.Address2, 
      City = (a == null) ? "" : a.City, 
      State = (a == null) ? 0 : a.StateId 
     })); 

Antwort

5
IQueryable<Branch> branches = GetBranches(); 

var result = braches. 
    SelectMany(b => b.Addresses. 
     DefaultIfEmpty(). 
     Select(a => new { Branch = b, Address = a })); 
2

Sie benötigen eine linke äußere Verbindung und keine innere Verbindung. Here's how.

2

Werfen Sie einen Blick auf this post, die zeigt, wie Sie das DefaultIfEmtpy-Konstrukt verwenden, um einen LINKEN JOIN auszuführen.

Nicht das auffälligste Merkmal von Linq Ich habe Angst.

0

Entschuldigung, vielleicht bin ich sehr spät - aber ich stieß auf ein ähnliches Problem und konnte auch 5,5 Jahre nach diesem Post keine konkrete Antwort finden. Meine Lösung (nicht optimiert - aber funktioniert):

public class YearDayBill 
{ 
    public string Name; 
    public int YearDay; 
} 

public class EatOutDaysOfYear 
{ 
    public string Name; 
    public List<int> YearDays; 
} 

public static class Program 
{ 
    static void Main() 
    { 
     var eatouts = new List<EatOutDaysOfYear> 
     { 
      new EatOutDaysOfYear {Name = "amit", YearDays = new List<int>() {59, 37, 31, 17, 29}}, 
      new EatOutDaysOfYear {Name = "prakash", YearDays = new List<int>() {6, 18, 13}}, 
      new EatOutDaysOfYear {Name = "sarvo", YearDays = new List<int>() {9, 7, 47, 56, 82, 96}}, 
      new EatOutDaysOfYear {Name = "akshay", YearDays = new List<int>() {8, 5, 2, 4}} 
     }; 

     // query to get properties of parent ('Name') and single child element 
     var bills = eatouts 
      .SelectMany(a => a.YearDays 
       .Select(b => new YearDayBill {Name = a.Name, YearDay = b})) 
      .OrderBy(d => d.Name)  // optional 
      .ThenBy(e => e.YearDay) // optional 
      .ToList(); 

     bills.ForEach(a => Console.WriteLine(string.Concat(a.Name, " | ", a.YearDay))); 
    } 
} 
Verwandte Themen