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:
- Dlaczego to działa poprzez DemoContext i nie IDemoContext?
- Jak zmienić IDemoContext, aby to zapytanie działało przez interfejs?
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
@Beyers Zasadniczo 'memberset' musi być typu' IQueryable '. Zaktualizowana odpowiedź. –
Eranga
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