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