ASP.MVC: репозиторий, который отражает IQueryable, но не Linq to SQL, DDD
Я хочу создать репозиторий DDD, который возвращает объекты IQueryable, которые соответствуют базовым классам Linq to SQL, за вычетом любых отношений. Я легко могу вернуть Entities минус отношения с Linq select new {field, field, ...} проекция. Как мне кодировать класс Repository Entity? Как бы я возвратил объект из репозитория, имеющий класс репозитория, а не класс Linq to SQL, и все равно заполнил бы его несколькими сущностями из выбора Linq? Как бы я сослался на этот возвращенный класс в моей ViewModel?
Я очень новичок в этом, поэтому очевидные ошибки. Я скучаю по лодке и должен возвращать только полные сущности из хранилища, а не проекцию? Мне все еще нужно удалить отношения Linq to SQL, прежде чем я отправлю их из хранилища. Я полностью не в курсе? Я действительно хочу сохранить тип данных IQueryable.
Например, мой код Linq to SQL в моем хранилище:
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>???
}
И в представлении (пытаясь строго ввести ViewModel), что будет тип данных моей модели и как ссылаться на представление?
<% Page Inherits="System.Web.Mvc.ViewPage<MyStore.Models.MiniProduct>" %>
Редактировать:
Котцак наделил полномочиями код и заставил его работать, поэтому он зарабатывает флажок. Тем не менее, Марк Симанн отметил, что этот метод будет вызывать побочные эффекты. Он был прав в том, что проецирование или поднабор вашего POCO - это плохо. После того, как код заработал, я закончил тем, что сделал еще одну вещь из объектов сущности, что вызывает ненужные сложности. В конечном итоге я изменил код, чтобы отразить предложения Марка.
Чтобы добавить к предложениям Котцака: Возвращаемое значение хранилища было IQueryable. Тип ссылки модели директивы страницы был
Inherits="System.Web.Mvc.ViewPage<IQueryable<MyStore.Models.MiniProduct>>"
Доступ к полям модели:
Model.SingleOrDefault().ProductNo
Model.SingleOrDefault().Name
...
И это привело к
foreach (MyStore.Models.MiniProduct myproduct in Model) {}
Спасибо вам обоим за ответы.