2012-01-19 10 views
6

Utworzono interfejs, który implementuje moja klasa DbContext, co pozwala mi utworzyć fałszywy kontekst db dla testów jednostkowych. Działa to dobrze dla wszystkich moich LINQ kwerendy tak daleko, ale taka, w której pojawia się następujący wyjątek:DbContext zgłasza wyjątek w zapytaniu, gdy uzyska się dostęp poprzez interfejs

Unable to create a constant value of type 'DemoApp.Member'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. 

Wykonywanie kwerendy LINQ poprzez interfejs rzuca powyższy wyjątek, jednak podczas wykonywania dokładnie to samo zapytanie bezpośrednio na mój DBContext zapytanie działa w 100%. Oto interfejs i powiązane definicje kodów demo:

Każdy członek może należeć do jednego podstawowego zespołu i opcjonalnie do wielu drugorzędnych zespołów. Poniższy kod demo rzuca wyjątek:

using (IDemoContext dbi = new DemoContext()) 
     { 
      var members = 
       (from member in dbi.Members 
       select new 
       { 
        Name = member.Name, 
        Team = member.PrimaryTeam.Name, 
        SecondaryTeams = from secondaryTeam in member.SecondaryTeams 
         join primaryMember in dbi.Members 
         on secondaryTeam.ID equals primaryMember.PrimaryTeamID 
         into secondaryTeamMembers 
         select new 
         { 
          Name = secondaryTeam.Name, 
          Count = secondaryTeamMembers.Count() 
         } 
       }).ToList(); 
     } 

Gdybym zmienić pierwszą linię do:

using (DemoContext dbi = new DemoContext()) 

następnie kwerenda wykonuje perfekcyjnie.

Więc moje pytania to:

  1. Dlaczego to działa poprzez DemoContext i nie IDemoContext?
  2. Jak zmienić IDemoContext, aby to zapytanie działało przez interfejs?

Odpowiedz

5

Spróbuj zastąpić dbi.Members zmienną lokalną w zapytaniu.

using (IDemoContext dbi = new DemoContext()) 
    { 
     IQueryable<Member> memberSet = dbi.Members; 

     var members = 
      (from member in memberSet 
      select new 
      { 
       Name = member.Name, 
       Team = member.PrimaryTeam.Name, 
       SecondaryTeams = from secondaryTeam in member.SecondaryTeams 
        join primaryMember in memberSet 
        on secondaryTeam.ID equals primaryMember.PrimaryTeamID 
        into secondaryTeamMembers 
        select new 
        { 
         Name = secondaryTeam.Name, 
         Count = secondaryTeamMembers.Count() 
        } 
      }).ToList(); 
    } 
+0

z tą zmianą, że teraz rzuca nowy wyjątek: obiekt typu „System.Data.Objects.ObjectQuery'1 [DemoApp.Member] "nie można przekonwertować na typ" System.Data.Entity.IDbSet'1 [DemoApp.Member] ". Ten wyjątek jest generowany zarówno dla IDemoContext, jak i dla DemoContext. – Beyers

+0

@Beyers Zasadniczo 'memberset' musi być typu' IQueryable '. Zaktualizowana odpowiedź. – Eranga

+0

Awesome, działa to w 100% i jest lepszym rozwiązaniem niż moje obejście z dbi.Members.Include (i => i.SecondaryTeams). Wciąż zainteresowany dokładnie wiedzieć, dlaczego nie działa przez interfejs, a nie poprzez DBContext. – Beyers

0

Znaleziono rozwiązanie, sztuką było włączenie SecondaryTeams w zapytaniu:

using (IDemoContext dbi = new DemoContext()) 
    { 
    var memberset = dbi.Members.Include(i => i.SecondaryTeams); 
    var members = 
     (from member in memberset 
     select new 
     { 
      Name = member.Name, 
      Team = member.PrimaryTeam.Name, 
      SecondaryTeams = from secondaryTeam in member.SecondaryTeams 
           join primaryMember in memberset 
       on secondaryTeam.ID equals primaryMember.PrimaryTeamID 
       into secondaryTeamMembers 
       select new 
       { 
        Name = secondaryTeam.Name, 
        Count = secondaryTeamMembers.Count() 
       } 
     }).ToList(); 
    } 
Powiązane problemy