C# 创建IEnumerable<&燃气轮机;不相关的EF4实体?

C# 创建IEnumerable<&燃气轮机;不相关的EF4实体?,c#,entity-framework,entity-framework-4,C#,Entity Framework,Entity Framework 4,下面是一个场景……我的网站展示了三种不同类型的产品供销售。例如,我们将它们称为家具、衣服和玩具。这三种产品明显不同,但都有一些相同的属性(Price、DateCreated、Description、ShortDescription等) 我使用的是EF4,所以当我在“家具”页面上显示产品列表时,我可以这样做: IEnumerable<Furniture> furniture = Repository.GetFurniture(); 所以我的问题是: 对Repository.GetAl

下面是一个场景……我的网站展示了三种不同类型的产品供销售。例如,我们将它们称为家具、衣服和玩具。这三种产品明显不同,但都有一些相同的属性(Price、DateCreated、Description、ShortDescription等)

我使用的是EF4,所以当我在“家具”页面上显示产品列表时,我可以这样做:

IEnumerable<Furniture> furniture = Repository.GetFurniture();
所以我的问题是:

对Repository.GetAllProducts(sellerId)的调用是什么样子的?它需要一组LINQ查询,获取所有家具、衣服和玩具,并将它们组合成一个IEnumerable。如果这是不可能的,我可以用什么其他方法来获得这样的产品列表

本质上,我只需要知道最好的方法是将一组具有一些公共属性的不相关对象组合到一个集合中,然后根据其中一个公共属性对该列表进行排序,然后在迭代它们时确定它是哪个具体类


谢谢

尝试为每个实体创建分部类。分部类将实现接口IPProduct,它不是EF的一部分,但具有返回价格、名称、广告日期等属性


实现这些属性getter以返回实体的特定属性,并实现方法GetAllProducts以返回所有实体类型的组合可枚举项。

您是否考虑过创建数据库视图并将其添加到上下文中。否则,

Repository.GetAllProducts(sellerId).OrderBy(sortField).Skip(skip).Take(take);
将在内存中运行,我的意思是,您必须至少在3个不同的dbset上执行它,并合并这些dbset以获得最终集

另一个选项是使用继承,创建一个基本产品类型,并从中继承3个不同的产品。 从上面的web博客中查看所有继承选项,这样就有另外两个博客需要跟进。

可选选项:

Union对象so Repository.GetFurniture().Cast().Union(Repository.GetCloth().Cast())类型集合中的所有产品


或者:使用动态和动态类型,并使用公共属性名称进行渲染。(bleg)

您的EF类是否已经实现了
IPProduct
?还是实现这一部分是问题的一部分?好问题。不,他们现在没有。哎呀,
if-then
类型上的逻辑是一种不可思议的代码味道。(想想如果添加第四种产品会发生什么情况?)关于如何实现最终目标,我愿意接受其他建议。这里使用的产品类型只是任意示例。该网站将永远不会超过我已经创建的三个。
@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).OrderBy(sortField).Skip(skip).Take(take);