Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-子类相关对象的快速加载_C#_Entity Framework 4 - Fatal编程技术网

C# 实体框架-子类相关对象的快速加载

C# 实体框架-子类相关对象的快速加载,c#,entity-framework-4,C#,Entity Framework 4,我想知道是否有可能为给定类的某些子类加载相关实体 班级结构如下 订单与许多基本子订单类(SuborderBase)相关。MySubOrder类继承自SuborderBase。我想为Include()指定路径,以便在加载订单时加载MySubOrder相关实体(Customer),但我收到一个错误,声称SuborderBase和Customer之间没有关系。但我的订单和客户之间存在关系 下面是失败的查询 Context.Orders.Include("SubOrderBases").Include(

我想知道是否有可能为给定类的某些子类加载相关实体

班级结构如下

订单与许多基本子订单类(SuborderBase)相关。MySubOrder类继承自SuborderBase。我想为Include()指定路径,以便在加载订单时加载MySubOrder相关实体(Customer),但我收到一个错误,声称SuborderBase和Customer之间没有关系。但我的订单和客户之间存在关系

下面是失败的查询

Context.Orders.Include("SubOrderBases").Include("SubOrderBases.Customers")
我如何明确地指定它

更新。实体方案如下

假设您将订单列表加载为LSTORDES,请尝试以下操作:

foreach (Orders order in lstOrders)
    order.SubOrderBases.Load();

客户也是如此。

这是一个只需要一次往返的解决方案:

var orders = Context.Orders
    .Select(o => new
    {
        Order = o,
        SubOrderBases = o.SubOrderBases.Where(s => !(s is MyOrder)),
        MyOrdersWithCustomers = o.SubOrderBases.OfType<MyOrder>()
            .Select(m => new
            {
                MyOrder = m,
                Customers = m.Customers
            })
    })
    .ToList()  // <- query is executed here, the rest happens in memory
    .Select(a => 
    {
        a.Order.SubOrderBases = new List<SubOrderBase>(
            a.SubOrderBases.Concat(
            a.MyOrdersWithCustomers.Select(m => 
                {
                    m.MyOrder.Customers = m.Customers;
                    return m.MyOrder;
                })));
        return a.Order;
    })
    .ToList();
var orders=Context.orders
.选择(o=>new
{
顺序=o,
SubOrderBases=o.SubOrderBases。其中(s=>!(s是MyOrder)),
MyOrdersWithCustomers=o.SubOrderBases.OfType()
.选择(m=>new
{
MyOrder=m,
顾客=m.顾客
})
})
.ToList()//
{
a、 Order.SubOrderBases=新列表(
a、 海螺亚目(
a、 MyOrdersWithCustomers.选择(m=>
{
m、 MyOrder.Customers=m.Customers;
返回m.MyOrder;
})));
返回a.订单;
})
.ToList();
它基本上是到匿名类型集合的投影。然后将查询结果转换为内存中的实体和导航属性。(它也适用于禁用的跟踪。)

如果不需要实体,可以省略第一个
ToList()
之后的整个部分,直接在匿名对象中处理结果

如果必须修改此对象图并需要更改跟踪,我不确定这种方法是否安全,因为加载数据时导航属性没有完全设置-例如
MyOrder。客户在投影后
is
null
,然后在内存中设置关系属性可能会被检测为一种修改,而这种修改不是,并且在调用时会造成问题
保存更改


预测是针对只读场景而不是修改进行的。如果您需要更改跟踪,可能更安全的方法是在多个往返中加载完整实体,因为在您的情况下,无法在一次往返中使用
Include
来加载整个对象图。

尝试以下方法:Context.Orders.Include(“SubOrderBases”).Include(“客户”)可能没有急于加载的解决方案。这是一个带有投影的变通方法(只有accepted answer中的第三个代码段有效,而不是第二个代码段,请参见对答案的注释):。这里()是一个类似的问题,根本没有答案。你能用代码(
Order
SubOrderBase
MySubOrder
Customer
)简单地描述一下类和关系吗?看着这些答案,人们似乎误解了你的问题。在第一次回答和评论之后,我也变得不确定了。添加了带课堂图表的图片谢谢!非常有趣的解决方案!这并不完全是我想要的,但我认为这个例子将是一个很好的启发,一个很好的答案,但这是一个非常愚蠢的做事方式。任何人都会认为EF团队忽略了关系数据库在表之间具有关系这一事实。