Ich wechselte gerade von Linq 2 SQL zu Entity Framework, und ich sehe einige seltsame Verhaltensweisen in EF, ich hoffe, dass jemand helfen kann. Ich habe versucht herum zu googlen, aber ich konnte keine anderen Leute mit demselben Problem finden. Ich habe ein Szenario ausgeheckt, um die Situation zu erklären.Entity Framework und Repository Pattern (Problem mit IQueryable)
Wenn ich direkt mit einem EF-Kontext arbeite, kann ich eine Auswahl innerhalb einer Auswahl treffen. Beispielsweise führt dies völlig in Ordnung:
// this is an Entity Framework context that inherits from ObjectContext
var dc = new MyContext();
var companies1 = (from c in dc.Companies
select new {
Company = c,
UserCount = (from u in dc.CompanyUsers
where u.CompanyId == c.Id
select u).Count()
}).ToList();
Allerdings, wenn ich ein Repository-Muster verwenden, auf dem das Repository IQueryable (oder sogar ObjectSet oder Object) zurückkehrt, erhalte ich eine NotSupportedException (LINQ to Entities nicht das Verfahren erkennen ‚System.Linq.IQueryable`1) ...
Hier ein Beispiel für meine Repository ist:
public class Repository {
private MyContext _dc;
public Repository() {
_dc = new MyContext();
}
public IQueryable<Company> GetCompanies() {
return _dc.Companies;
}
public IQueryable<CompanyUser> GetCompanyUsers() {
return _dc.CompanyUsers;
}
}
// ich bin das Repository innerhalb einer anderen Klasse (zB in meiner Services-Ebene)
var repository = new Repository();
var companies2 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in repository.GetCompanyUsers()
where u.CompanyId == c.Id
select u).Count()
}).ToList();
Der obige Code löst eine NotSupportedException aus.
Ich weiß, dass, wenn es eine Verbindung zwischen Unternehmen und CompanyUsers, dann kann ich einfach das tun, und es wird funktionieren:
var companies3 = (from c in repository.GetCompanies()
select new {
Company = c,
UserCount = (from u in c.CompanyUsers
select u).Count()
}).ToList();
... aber mein Beispiel ist nur eine vereinfachte Version eines komplizierteren Szenario, in dem ich keine Verbindung zwischen den Entitäten habe.
Also ich bin sehr verwirrt, warum Entity Framework die NotSupportedException wirft. Wie funktioniert es, dass die Abfrage einwandfrei funktioniert, wenn ich direkt mit dem EF-Kontext arbeite, aber nicht, wenn ich mit IQueryable arbeite, das von einer anderen Methode stammt? Dies funktionierte perfekt mit Linq 2 SQL, aber es scheint nicht in Entity Framework zu funktionieren.
Jeder Einblick würde sehr geschätzt werden.
Vielen Dank im Voraus.
Warum brauchen wir das? Ich meine, wir haben hier Assoziationen? – paragy
+1 U beantwortet es auch .. – paragy
Dies erfordert zwei Rundfahrten zum Server obwohl ... warten, oder? –