Frage

Ich arbeite mich durch die MVC Storefront-Code und versuchen, den Weg eines Repository, ein Service und ein Modell zu folgen, die ein poco ist, außerhalb des dbml / Datenkontext. Es ist ziemlich einfach wirklich zu folgen, bis ich in einer Art und Weise versagt Schreiben von Tests und Dinge begann ich verstehe einfach nicht.

In meinem Fall der Primärschlüssel ist ein unique anstelle eines int Feld. 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.

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

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

Das funktioniert ganz gut, hat eine Model.Restaurant. Nun, wenn ich versuche, die gleichen Dinge mit dem PKID:

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 ist [Model.Restaurants] ist eine Klasse Ebene der linq2sql Schicht nicht bewusst ist. Für mich bedeutet, dass die die erste Version nicht funktionieren sollte. Natürlich, wenn mein Stück ein int ist, funktioniert es ganz gut.

Was ist hier wirklich los? Herr weiß, es ist nicht sehr intuitiv ist eine Arbeit und einen haben, nicht funktionieren. Was bin ich Missverständnis?

War es hilfreich?

Lösung

Ich denke, das Problem hier gebührt einen Konstruktor Überlastung verwenden, und erwartet, dass die Abfrage in zu füllen. Wenn Sie einen Vorsprung, wie dies zu tun, müssen Sie all die Dinge, setzen Sie in dem in der Projektion Abfrage sein wollen Ist Projektion selbst. Sonst wird nicht Linq, dass in der SQL-Abfrage enthalten.

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.

Andere Tipps

Nicht diesen Code tatsächlich eingegeben haben aus, haben Sie versucht,

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

Ninja

Das hat wahrscheinlich mit der Tat zu tun, dass Sie die GUID in der Abfrage zu instanziieren versucht, und ich denke, dass LINQ to SQL, dass der tatsächlichen SQL-Code zu konvertieren versucht, bevor das Objekt erstellt wird.

Versuchen Sie, bevor die Abfrage Instanziieren und nicht auf die Abfrage.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top