所以这就是场景......我的网站显示了三种不同类型的待售产品。在这个例子中,我们称之为家具,衣服和玩具。这三种产品截然不同,但它们共享一些相同的属性(Price,DateCreated,Description,ShortDescription等)。
我正在使用EF4,所以当我在“家具”页面上显示产品列表时,我可以这样做:
IEnumerable<Furniture> furniture = Repository.GetFurniture();
当我只在页面上显示一种产品类型时,一切都很好用。我将整套家具显示在每页10个产品的分页列表中,可按名称,价格,广告日期等进行排序。
但是,我想创建一个链接“查看所有卖家的产品”。无论是家具,衣服还是玩具,此页面都需要显示卖家列出的所有内容。诀窍是,它还需要按所有产品共享的字段(价格,名称,广告日期等)进行排序。
所以我想做的就是这个伪代码:
IEnumerable<IProduct> products =
Repository.GetAllProducts(sellerId).OrderBy(sortField).Skip(skip).Take(take);
然后,在视图中(是的,我在视图中引用EF4实体):
@foreach (var product in Model.products.OrderBy(sortField))
{
if (product is Furniture)
{
Html.RenderPartial("FurnitureResult", (Furniture)product)
}
else if (product is Clothes)
{
Html.RenderPartial("ClothesResult", (Clothes)product)
}
// repeat for toys
}
所以我的问题是:
对Repository.GetAllProducts(sellerId)的调用是什么样的?它需要是一组LINQ查询,它们可以获取所有家具,衣服和玩具,并将它们组合成一个IEnumerable&lt;&gt;。如果那是不可能的,我可以用什么方法来获得这样的产品清单?
基本上我只需要知道最好的方法是将一组具有一些共同属性的无关对象分组到一个集合中,然后通过一个公共属性对该列表进行排序,然后确定它是哪个具体类。迭代他们。
谢谢!
答案 0 :(得分:2)
尝试为每个实体创建分部类。部分类将实现接口IProduct,它不是EF的一部分,但具有返回价格,名称,广告日期等属性。
实现这些属性getter以返回实体的特定属性,并实现GetAllProducts方法以返回所有实体类型的组合可枚举。
答案 1 :(得分:0)
您是否考虑过创建数据库视图,并将其添加到您的上下文中。否则,
Repository.GetAllProducts(sellerId).OrderBy(sortField).Skip(skip).Take(take);
会在内存中运行,我的意思是你必须至少在3个不同的DbSet上执行它,并合并它们以获得最终的设置。
另一种选择是使用继承,创建基本产品类型,并从中继承3种不同的产品。 http://weblogs.asp.net/manavi/archive/2010/12/24/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph.aspx 查看上述网络博客中的所有继承选项,因此还有2个博客可供跟进。
答案 2 :(得分:0)
备选方案:
将所有产品联合在Object类型的集合中,以便Repository.GetFurniture()。Cast()。Union(Repository.GetClothes()。Cast());
或者:使用动态和ducktyping并使用公共属性名称进行渲染。 (bleg)