EF将儿童的参考资料包括在父母的兄弟姐妹中

时间:2017-05-23 18:23:31

标签: c# entity-framework linq include

我查询我的交货并包含其中一个属性(物料类型),并且除了我的物料类型有一个交货清单外,它还返回了一切。因此,它的回归交付兄弟姐妹。

以下是我的课程:

public class Delivery
{
    public int DeliveryId { get; set; }
    public DateTime DeliveryDate { get; set; }
    ...
    public int MaterialTypeId { get; set; }
    public virtual MaterialType MaterialType { get; set; }
}

public class MaterialType
{
    public int MaterialTypeId { get; set; }
    public string Name { get; set; }
    ...
    public virtual ICollection<Delivery> Deliveries { get; set; }
}

以下是按日期范围

的分娩查询
var deliveries = DataStore.Filter<Delivery>(i =>
                 i.DeliveryDate >= startDate && i.DeliveryDate < endDate
                 ,new string[] { "MaterialType" }) // Includes
                 .OrderByDescending(i => i.DeliveryDate).ToList();

public virtual IQueryable<T> Filter<T>(Expression<Func<T, bool>> predicate, string[] includes = null) where T : class
{
    IQueryable<T> set = dbContext.Set<T>();
    if (includes != null && includes.Count() > 0)
    {
        foreach (var include in includes)
        {
            set = set.Include(include);
        }
    }
    return set.Where<T>(predicate).AsQueryable<T>();
}

以下是我从查询中返回的结果,并且正在使用原始交付的兄弟信息填充Delivery.MaterialType.Delivery。

[{
    "DeliveryId": 1,
    "DeliveryDate": "2017-05-22",
    "MaterialTypeId": 2,
    "MaterialType": {
        "MaterialTypeId": 2,
        "Name": "Bulk",
        "Deliveries": [{
            "DeliveryId": 2,
            "DeliveryDate": "2017-05-22",
            "MaterialTypeId": 2,
        },
        {
            "DeliveryId": 3,
            "DeliveryDate": "2017-05-22",
            "MaterialTypeId": 2,
        }]
    }
}]

延迟加载设置为禁用。

dbContext.Configuration.LazyLoadingEnabled = false;

有没有办法阻止MaterialTypes填充Deliveries?

2 个答案:

答案 0 :(得分:2)

我不确定延迟加载是否有问题,相反,这可能需要对关系的自动连接做些什么。

因此,假设您有物料类型A的交货A和物料类型A的交货B.如果您为交货发出查询并包含物料类型,那么物料类型A中的交货清单将包含交货A和交货B,因为它们无论如何都会作为查询的结果加载到上下文中。

禁用延迟加载只会告诉EF在访问属性时不加载任何实体,但它没有说明修复已经在上下文中的实体之间的关系。

如果使用相同的DbContext对象发出多个查询,则会发生同样的情况:一旦运行查询并实现结果,对象就在上下文中。因此,如果您使用相同的上下文发出另一个查询,其中一个结果对象具有对先前加载的实体的引用,则会根据上下文中的对象自动填充导航属性。

答案 1 :(得分:0)

您正在序列化的对象启用了延迟加载,因此它会填充所有属性。在查询之前禁用这样的延迟加载:

DataStore.Configuration.LazyLoadingEnabled = false;