2016-08-09 9 views
0

Ich habe diese Klassen:Linq C# Nullwerte auf Navigationseigenschaften Joining

class Group 
{ 
    public int GroupID { get; set; } 
    public string PlaceOfMeeting { get; set; } 
    public int? PublisherID { get; set; } 
    public IEnumerable<Publisher> Publishers { get; set; } 
    public Publisher Publisher { get; set; } 
} 

class Publisher 
{ 
    public int PublisherID { get; set; } 
    public int GroupID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string MiddleName { get; set; } 
    public int Gender { get; set; } 
    public string Nationality{ get; set; } 
} 

, und ich will mit Linq wählen wie diese Daten-Set:

QUERY

SELECT TOP 1000 [Groups].[GroupID], 
    [Groups].[PlaceOfMeeting], 
    [Groups].[PublisherID], 
    [publisher].[MiddleName], 
    [publisher].[Gender], 
    [publisher].[Nationality] 
FROM [dbo].[Groups] 
left outer join Publisher 
on Publisher.PublisherID = Groups.PublisherID 

AUSGABE

GroupID PlaceOfMeeting PublisherID Middle Geschlecht Nationalität

1 Angola 1 Kojo 1 Ghanaian

2 Eigentum 2 Joe 1 Ghanaian

3 Banchem 3 Kofi 1 Ghanaian

4 Kwabedu NULL NULL NULL NULL

Ich möchte diese mit Linq tun

Ich habe versucht, so etwas Dataset oder Objekt, sondern bin immer Argument @ Linie 18 und die Nachricht war Wert nicht Da einige der Rekordwerte übergeben null sein kann, Publisher sind null

List<ValueObjects.Group> GetAllGroups() { 

     DataTable Groups = HelperClass.GetTable("Groups", connectionString); 
     DataTable Publishers = HelperClass.GetTable("Publisher", connectionString); 
     DataTable Contacts = HelperClass.GetTable("Contacts", connectionString); 
     var groups = Groups.AsEnumerable(); 
     var publishers = Publishers.AsEnumerable(); 


     var group = from g in groups 
        join p in Publishers.AsEnumerable() on g.Field<int?>("PublisherID") equals p.Field<int?>("PublisherID") into g_p 
        from pub in g_p.DefaultIfEmpty() 
        select new Group() 
        { 
         GroupID = g.Field<int>("GroupID"), 
         PlaceOfMeeting = g.Field<string>("PlaceOfMeeting"), 
         Publisher = g.Field<int?>("PublisherID"), 
         Publisher = new Publisher() 
         { 
          PublisherID = pub.Field<int>("PublisherID"), 
          GroupID = pub.Field<int>("GroupID"), 
          FirstName = pub.Field<string>("FirstName"), 
          LastName = pub.Field<string>("LastName"), 
          MiddleName = pub.Field<string>("MiddleName"), 
          Gender = (Gender)pub.Field<int>("Gender"), 

          Nationality = pub.Field<string>("Nationality"), 
         }, 
         Publishers = from p in publishers.DefaultIfEmpty() 
             where p.Field<int>("GroupID") == g.Field<int>("GroupID") 
             join c in Contacts.AsEnumerable().DefaultIfEmpty() on p.Field<int>("PublisherID") equals c.Field<int>("PublisherID") 
             select new Publisher 
             { 
              PublisherID = p.Field<int>("PublisherID"), 
              GroupID = p.Field<int>("GroupID"), 
              FirstName = p.Field<string>("FirstName"), 
              LastName = p.Field<string>("LastName"), 
              MiddleName = p.Field<string>("MiddleName"), 
              Gender = (Gender)p.Field<int>("Gender"), 

              Nationality = p.Field<string>("Nationality"), 
              Contacts = new Contacts 
              { 
               Phone1 = c.Field<string>("Phone1"), 
               Phone2 = c.Field<string>("Phone2") 
              }, 
             } 
        }; 

     return group.ToList(); 
    } 
+0

So haben Sie eine Liste der Gruppen und eine Liste der Publisher in Ihrem Code? Sie müssen die beiden Listen mit Left Outer Join verbinden. Siehe msdn: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

+2

Mögliches Duplikat von [LEFT OUTER JOIN in LINQ] (http://stackoverflow.com/questions/3404975/left-outer-) join-in-linq) –

+0

Ja, ich möchte Nullwerte an das Objekt zurückgeben Publisher – Maron

Antwort

0

das bedeutet, dass manchmal publisher ist null, wegen der "Outer-Join", dh die join ... into (GroupJoin). Ersetzen Sie den Teil ...

Publisher = new Publisher() 
{ 
    ... 
} 

... von ...

Publisher = pub == null ? default(Publisher) : new Publisher() 
{ 
    PublisherID = pub.Field<int>("PublisherID"), 
    GroupID = pub.Field<int>("GroupID"), 
    FirstName = pub.Field<string>("FirstName"), 
    LastName = pub.Field<string>("LastName"), 
    MiddleName = pub.Field<string>("MiddleName"), 
    Gender = (Gender)pub.Field<int>("Gender"), 
    Nationality = pub.Field<string>("Nationality"), 
}, 
+0

danke Arnold 4 ur Ans – Maron

Verwandte Themen