ASP.MVC: Repository, in dem IQueryable, jedoch nicht Linq to SQL, DDD enthalten ist
Ich möchte ein DDD-Repository erstellen, das IQueryable Entities zurückgibt, die den zugrunde liegenden Klassen von Linq to SQL ohne Beziehungen entsprechen. Ich kann Entities ohne die Relationen mit einer neuen {field, field, ...} Projektion von Linq select leicht zurückgeben. Wie codiere ich die Repository-Entitätsklasse? Wie kann ich ein Objekt aus dem Repository mit der Repository-Klasse und nicht der Linq to SQL-Klasse zurückgeben und es dennoch mit mehreren Entitäten aus der Linq-Auswahl füllen? Wie würde ich diese zurückgegebene Klasse in meinem ViewModel referenzieren?
Das ist mir sehr neu, daher die offensichtlichen Fehler. Verpasse ich das Boot und sollte nur vollständige Entities aus dem Repository zurückgeben, keine Projektion? Ich würde immer noch die Linq to SQL-Beziehungen entfernen müssen, bevor ich sie aus dem Repository sende. Bin ich total daneben? Ich möchte wirklich den IQueryable-Datentyp beibehalten.
Beispiel: Mein Linq to SQL-Code in meinem Repository:
public class MiniProduct
{
public MiniProduct( string ProductNo, string Name, string Description, double Price)
{ this.ProductNo = ProductNo;
this.Name = Name;
this.Description = Description;
this.Price = Price;
}
}
public IQueryable<MiniProduct> GetProductsByCategory( string productCategory)
{
return ( from p in db.Products
from c in db.Categories
from pc in db.ProductCategories
where c.CategoryName == productCategory &&
c.CatID == pc.CatID &&
pc.ProductID == p.ProductID
select new { p.ProductNo, p.Name, p.Description, p.Price } );
// how to return IQueryable<MiniProduct> instead of IQueryable<AnonymousType>???
}
Und in der Ansicht (versuchen, stark ViewModel eingeben), was wäre mein Modelldatentyp und wie aus der Ansicht zu verweisen?
<% Page Inherits="System.Web.Mvc.ViewPage<MyStore.Models.MiniProduct>" %>
Bearbeiten:
Cottsak hat den Code aktiviert und zum Laufen gebracht, sodass er sich das Kontrollkästchen verdient. Mark Seemann wies jedoch darauf hin, dass diese Technik Nebenwirkungen verursachen wird. Er hatte Recht damit, dass das Projizieren oder Untereinstellen Ihres POCO schlecht ist. Nachdem ich den Code zum Laufen gebracht hatte, machte ich eine Tonne mehr aus Entity-Objekten, was zu unnötigen Komplikationen führte. Letztendlich habe ich den Code geändert, um Marks Vorschläge widerzuspiegeln.
Hinzufügen zu Cottsaks Vorschlägen: Mein Rückgabewert für das Repository war IQueryable. Der Referenztyp für das Seitenanweisungsmodell war
Inherits="System.Web.Mvc.ViewPage<IQueryable<MyStore.Models.MiniProduct>>"
Auf die Modellfelder wurde zugegriffen von:
Model.SingleOrDefault().ProductNo
Model.SingleOrDefault().Name
...
Und das führte zu einem
foreach (MyStore.Models.MiniProduct myproduct in Model) {}
Vielen Dank für die Antworten.