2013-03-14 10 views
6

Dieser Artikel macht mich verrückt ;-) Ich versuche, eine einfache Abfrage Verbinden von zwei TabellenMVC 4. und Entity Framework Table-Join

ich zu tun habe folgendes:

Repository Klasse Methode

public IQueryable<ADPerson> FindAll(string UserId) 
    { 
     return (from p in db.ADPerson 
       select p); 


    } 

In meinem Controller:

var ADPersonList = from o in ADPersonDB.FindAll(GetUserId()) 
        join c in MSDNTypeDB.FindAll(GetUserId()) on o.MsdnTypeId equals c.MsdnTypeId 
        select new ADPerson() 
        { 

         AdPersonId = o.AdPersonId, 
         SamAccountName = o.SamAccountName, 
         Description = o.Description, 
         DisplayName = o.DisplayName, 
         UserPrincipalName = o.UserPrincipalName, 
         Enabled = o.Enabled, 
         LastUpdated = o.LastUpdated, 
         OnlineAssetTag = o.OnlineAssetTag, 
         MsdnTypeId = o.MsdnTypeId, 
         MsdnSubscription = c.MsdnTypeDescription, 


        }; 

ich halte eine E bekommen rror:

{"The specified LINQ expression contains references to queries that are associated with different contexts."} 

Ich habe auch versucht, in das Repository-Klasse hinzu:

Repository Klasse Methode

public IQueryable<ADPerson> FindAll(string UserId) 
    { 
     //return (from p in db.ADPerson 
     //  select p); 

     var query = from o in db.ADPerson 
        join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId 
        select new ADPerson() 
        { 

         AdPersonId = o.AdPersonId, 
         SamAccountName = o.SamAccountName, 
         Description = o.Description, 
         DisplayName = o.DisplayName, 
         UserPrincipalName = o.UserPrincipalName, 
         Enabled = o.Enabled, 
         LastUpdated = o.LastUpdated, 
         OnlineAssetTag = o.OnlineAssetTag, 
         MsdnTypeId = o.MsdnTypeId, 

         MsdnSubscription = c.MsdnTypeDescription, 


        }; 

     return query; 

    } 

ist es wirklich so schwer, eine einfache zwischen zwei Tabellen zu tun, verbinden und die Variable bevölkern in Entity Framework

Dank

+0

Ist es der gleiche Fehler der zweite Methode verwenden? – mattytommo

+0

Ausgezeichneter Punkt: Nein, der zweite Fehler lautet: Die Entität oder der komplexe Typ 'project.Models.ADPerson' kann nicht in einer LINQ to Entities-Abfrage erstellt werden. –

+0

RE: der zweite Fehler. Das liegt daran, dass Sie auf eine zugeordnete Entität nicht projizieren können. Sie können die Abfrage auf ein anonymen Objekt projizieren und anschließend der ADPerson-Entität anschließend zuordnen. –

Antwort

6

Projekt zu einem anonymen Objekt

var query = from o in db.ADPerson 
    join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId 
    select new 
    { 
    AdPersonId  = o.AdPersonId, 
    SamAccountName = o.SamAccountName, 
    Description  = o.Description, 
    DisplayName  = o.DisplayName, 
    UserPrincipalName = o.UserPrincipalName, 
    Enabled   = o.Enabled, 
    LastUpdated  = o.LastUpdated, 
    OnlineAssetTag = o.OnlineAssetTag, 
    MsdnTypeId  = o.MsdnTypeId, 
    MsdnSubscription = c.MsdnTypeDescription, 
    }; 

dann zu Ihrem Unternehmen Karte zurück

foreach (var item in query) 
{ 
    var adPerson = new ADPerson 
    { 
    AdPersonId   = item.AdPersonId, 
    SamAccountName  = item.SamAccountName, 
    Description  = item.Description, 
    DisplayName  = item.DisplayName, 
    UserPrincipalName = item.UserPrincipalName, 
    Enabled   = item.Enabled, 
    LastUpdated  = item.LastUpdated, 
    OnlineAssetTag  = item.OnlineAssetTag, 
    MsdnTypeId   = item.MsdnTypeId, 
    MsdnSubscription = item.MsdnTypeDescription, 
    { 
} 
+0

Die erste var-Abfrage ist fehlgeschlagen, soll dort neu gewählt werden? –

+0

@DavidCostelloe ja, tut mir leid. Bearbeitete Antwort –

+0

Fehler erhalten "Ungültiger Spaltenname" MsdnSubscription "auf Anzeige des Feldes –

2
public IQueryable<ADPerson> FindAll(string UserId) 
    { 
     // return (from p in db.ADPerson 
     //  select p); 
     List<ADPerson> lst = new List<ADPerson>(); 
     var query = from o in db.ADPerson 
        join c in db.MsdnTypes on o.MsdnTypeId equals c.MsdnTypeId 
        select new 
         { 

          AdPersonId = o.AdPersonId, 
          SamAccountName = o.SamAccountName, 
          Description = o.Description, 
          DisplayName = o.DisplayName, 
          UserPrincipalName = o.UserPrincipalName, 
          Enabled = o.Enabled, 
          LastUpdated = o.LastUpdated, 
          OnlineAssetTag = o.OnlineAssetTag, 
          MsdnTypeId = o.MsdnTypeId, 
          MsdnSubscription = c.MsdnTypeDescription 

         }; 
     foreach (var item in query) 
     { 
      var adPerson = new ADPerson() 
       { 
        AdPersonId = item.AdPersonId, 
        SamAccountName = item.SamAccountName, 
        Description = item.Description, 
        DisplayName = item.DisplayName, 
        UserPrincipalName = item.UserPrincipalName, 
        Enabled = item.Enabled, 
        LastUpdated = item.LastUpdated, 
        OnlineAssetTag = item.OnlineAssetTag, 
        MsdnTypeId = item.MsdnTypeId, 
        MsdnSubscription = item.MsdnSubscription 
       }; 
      lst.Add(adPerson); 

     } 

     return lst.AsQueryable(); 



    } 
+0

Es könnte sein, dass Sie ein abschließendes Komma bei "MsdnSubscription = c.MsdnTypeDescription" und auch auf der zweite – eburgos

+0

Danke gefunden, es war die Klammer {und}; fast da :-) –

Verwandte Themen