Desidero creare un repository DDD che restituisca le entità IQueryable che corrispondono alle classi sottostanti di Linq a SQL, meno le relazioni. Posso facilmente restituire Entità meno le relazioni con una Linq selezionare una nuova {field, field, ...} proiezione. Come si codifica la classe Entity repository? Come faccio a restituire un oggetto dal repository avere la classe repository non il LINQ to SQL di classe ed ancora riempirlo con più entità dalla selezione Linq? Come faccio a fare riferimento a questa classe restituita nel mio ViewModel?ASP.MVC: Repository che riflette IQueryable ma non Linq a SQL, DDD How To question
Sono molto nuovo a questo, quindi gli errori evidenti. Mi manca la barca e dovrei restituire solo Entità complete dal repository, non una proiezione? Avrei comunque bisogno di rimuovere le relazioni da Linq a SQL prima di inviarle dal repository. Sono totalmente fuori base? Voglio davvero mantenere il tipo di dati IQueryable.
Per esempio, il mio LINQ to SQL di codice nel mio 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>???
}
E alla vista (cercando di tipo fortemente ViewModel) quello che sarebbe stato il mio modello di tipo di dati e come fare riferimento dal punto di vista?
<% Page Inherits="System.Web.Mvc.ViewPage<MyStore.Models.MiniProduct>" %>
Edit:
Cottsak il potere del codice e ha reso il lavoro, così lui guadagna la casella di controllo. Tuttavia, Mark Seemann ha sottolineato che questa tecnica causerà effetti collaterali. Aveva ragione in quel progetto o sotto-impostazione che il tuo POCO è cattivo. Dopo aver fatto il codice di lavoro, ho finito per fare una tonnellata più una tantum oggetti entità, che provoca inutili complicazioni. Alla fine ho cambiato il codice per riflettere i suggerimenti di Mark.
Per aggiungere ai suggerimenti di Cottsak: Il mio valore di ritorno repository era IQueryable. Il tipo di modello di riferimento direttiva pagina è stata
Inherits="System.Web.Mvc.ViewPage<IQueryable<MyStore.Models.MiniProduct>>"
I campi modello erano accessibili da:
Model.SingleOrDefault().ProductNo
Model.SingleOrDefault().Name
...
E questo ha portato ad una
foreach (MyStore.Models.MiniProduct myproduct in Model) {}
Vi ringrazio entrambi per le risposte.
L'idea di visualizzazione fortemente corretta è corretta. Il tuo esempio è giusto. –