我查询我的交货并包含其中一个属性(物料类型),并且除了我的物料类型有一个交货清单外,它还返回了一切。因此,它的回归交付兄弟姐妹。
以下是我的课程:
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?
答案 0 :(得分:2)
我不确定延迟加载是否有问题,相反,这可能需要对关系的自动连接做些什么。
因此,假设您有物料类型A的交货A和物料类型A的交货B.如果您为交货发出查询并包含物料类型,那么物料类型A中的交货清单将包含交货A和交货B,因为它们无论如何都会作为查询的结果加载到上下文中。
禁用延迟加载只会告诉EF在访问属性时不加载任何实体,但它没有说明修复已经在上下文中的实体之间的关系。
如果使用相同的DbContext对象发出多个查询,则会发生同样的情况:一旦运行查询并实现结果,对象就在上下文中。因此,如果您使用相同的上下文发出另一个查询,其中一个结果对象具有对先前加载的实体的引用,则会根据上下文中的对象自动填充导航属性。
答案 1 :(得分:0)
您正在序列化的对象启用了延迟加载,因此它会填充所有属性。在查询之前禁用这样的延迟加载:
DataStore.Configuration.LazyLoadingEnabled = false;