【发布时间】:2012-12-17 03:55:15
【问题描述】:
我正在编写一些位于实体框架之上的 BLL 代码(使用 DBContext 生成的 DAL 类,但这对于这个问题并不重要)。这是我的日常工作之一:
public static Customer Get(int32 CustID, IEnumerable<string> IncludeEntities = null)
{
}
所以当我调用它时,我会传递一个 CustID,一个我想要包含的实体的可选列表 - 例如“订单”和“订单详细信息”:
Customer customer = CustomerBLLRepository.Get("ALFKI",
new[] { "Orders", "Orders.Order_Details"});
它工作得很好,但我不喜欢用字符串列表或数组来调用它——我想获得强类型,以便 IDE 可以提供帮助。
我可以通过这样声明来接收类型列表:
public static void GetTest(Int32 CustID, params Type[] IncludeEntities)
{
}
并获取类名作为包含工作的字符串,但是调用者必须像这样使用 typeofs:
CustomerRepository.GetTest(123, typeof(Order), typeof(OrderDetails));
这不是世界末日,但这会导致问题,因为 OrderDetails 实际上是 Orders 的导航属性,并且包含需要调用 Orders.OrderDetails,我必须让代码四处寻找才能找到子实体 OrderDetails 中的哪个实体仍然生成字符串。
我真正想要的是一个强类型的实体列表,以与 EF 希望它们作为包含相同的格式传递,但我认为我是 SOL。
【问题讨论】:
-
按类型来做这件事很难。如果客户有两个与“订单”类型匹配的属性怎么办?例如 Customer.OpenOrders 和 Customer.CompletedOrders,都是 List
. 类型 -
你可以使用枚举。这样您就可以控制值列表。直接使用类型可以使您处于有人放入甚至不是实体的类型的位置。这可能会导致一些复杂的参数验证场景。
-
Matt - 我错过了您现在可以将 Lambda 与 Include 一起使用的事实 - 所以我认为这是显而易见的答案。
-
不过,不要把这种方法误认为是属于 BLL 的方法!
标签: c# entity-framework generics typeof