2013-03-14 15 views
6

ta pozycja będzie doprowadza mnie do szaleństwa ;-) Próbuję zrobić proste zapytanie łączącą dwie tabeleMVC i Entity Framework 4. Tabela Dołącz

Mam następujący:

metody Repository klasy

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


    } 

w moim kontrolera:

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, 


        }; 

Wciąż dostaję e rror:

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

Próbowałem też dodanie do repozytorium Klasa:

metoda Repository klasy

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; 

    } 

Czy to naprawdę tak trudno zrobić proste połączenie między dwiema tabelami i wypełnić zmiennej w Entity framework

Dzięki

+0

Czy to ten sam błąd za pomocą drugiej metody? – mattytommo

+0

Doskonały punkt: brak błędu zwracanego w drugim przypadku: Jednostka lub typ złożony "project.Models.ADPerson" nie może zostać skonstruowany w kwerendzie LINQ to Entities. –

+0

RE: drugi błąd. Dzieje się tak, ponieważ nie można * projektować * na zmapowany obiekt. Możesz wysłać zapytanie do anonimowego obiektu, a następnie zmapować go do encji ADPerson, po czym –

Odpowiedz

6

Projekt anonimowego obiektu

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, 
    }; 

Następnie mapę z powrotem do swojej jednostki

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

Pierwsze zapytanie var nie działa, czy powinno być wybrane nowe? –

+0

@DavidCostelloe tak, przepraszam. Edytowana odpowiedź –

+0

Otrzymywanie błędu "Nieprawidłowa nazwa kolumny" MsdnSubscription "na wyświetleniu pola –

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

może to być przecinek końcowy w "MsdnSubscription = c.MsdnTypeDescription", a także na drugi jeden – eburgos

+0

Dzięki temu okazało się, że to klamra {i}; prawie tam :-) –