2009-05-01 14 views
0

Ich arbeite mich durch den MVC Storefront-Code und versuche, den Pfad eines Repositorys, eines Service und eines Modells, das ein poco ist, außerhalb des dbml/data-Kontextes zu folgen. Es ist ziemlich einfach, tatsächlich zu folgen, bis ich anfing, Tests zu schreiben, und die Dinge versagten auf eine Weise, die ich einfach nicht verstehe.IQueryable, wo, Guid und

In meinem Fall ist der Primärschlüssel eine eindeutige Kennung anstelle eines int-Felds. Das Repository gibt ein IQueryable:

public IQueryable<Restaurant> All() 
{ 
    return from r in _context.Restaurants select new Restaurant(r.Id) 
     { 
      Name = r.Name 
     }; 
} 

In diesem Fall Restaurant ist ein Models.Restaurant natürlich und nicht _context.Restaurants.Restaurant.

Filterung in der Serviceklasse (oder in Repository Unit-Tests) gegen Alle(), das funktioniert wie erwartet:

var results = Repository.All().Where(r => r.Name == "BW<3").ToList(); 

Dies funktioniert gut, hat man Model.Restaurant. Nun, wenn ich die gleichen Dinge mit dem PKID versuchen:

var results = Repository.All().Where(r => r.Id == new Guid("088ec7f4-63e8-4e3a-902f-fc6240df0a4b")).ToList(); 

Wenn nicht mit:

The member 'BurningPlate.Models.Restaurant.Id' has no supported translation to SQL. 

Wenn einige similiar Beiträge gesehen, wo die Leute sagen, es ist, weil r => r.Id [Model ist. Restaurants] ist eine Klassenstufe, die der linq2sql-Ebene nicht bekannt ist. Für mich bedeutet das, dass auch die erste Version nicht funktionieren sollte. Natürlich, wenn mein PC ein Int ist, funktioniert es gut.

Was ist hier wirklich los? Gott weiß, es ist nicht sehr intuitiv, wenn man arbeitet und nicht arbeitet. Was verstehe ich falsch?

Antwort

0

Ich denke, das Problem hier ist wegen der Verwendung eines Konstruktors überladen, und erwartet, dass die Abfrage es ausfüllen. Wenn Sie eine Projektion wie folgt machen, müssen Sie alle Dinge, die Sie in der Projektionsabfrage sein möchten die eigentliche Projektion selbst. Andernfalls wird Linq das nicht in die SQL-Abfrage aufnehmen.

So umschreiben Ihre Bits wie folgt:

return from r in _context.Restaurants select new Restaurant() 
     { 
      Id=r.Id, 
      Name = r.Name 
     }; 

Dies sollte es reparieren.

+0

Und tatsächlich war das mein Problem. Danke Rob! – claco

0

Nicht aus dieser Code tatsächlich eingegeben haben, haben Sie

versucht

var results = Repository.All(). Wo (r => r.Id.Equals (neu Guid ("088ec7f4-63e8-4e3a-902f -fc6240df0a4b ")). ToList()

Ninja

+0

Nun, ja und nein. :-) Ich versuchte die r => gleich (r.Id, neue Guid()) und Equals (r.Id, idvar) Versionen mit dem gleichen Fehler. Ich habe nicht versucht r => r.Id.Equals (idvar). Ich kann nicht sagen, dass ich diese Variation gesehen habe. – claco

+0

Repository.All() .Wobei (r => r.Id.Equals (id)). ToList(); Gleicher Fehler. – claco

0

dies wahrscheinlich mit der Tat zu tun hat, dass Sie die gUID in der Abfrage zu instanziieren versucht, und ich denke, dass LINQ to SQL, dass die tatsächlichen zu konvertieren versucht SQL-Code vor dem Erstellen des Objekts

Versuchen Sie, vor dem q instanziieren sehr und nicht auf die Abfrage.

+0

Gleicher Fehler. var id = neu Guid ("088ec7f4-63e8-4e3a-902f-fc6240df0a4b"); var ergebnisse = Repository.All(). Wobei (r => r.Id == id) .ToList(); – claco