我有三个模型课
public class Item1{
public int Id;
public List<Item2> Item2List { get; set; }
}
public class Item2{
public int Id;
//this is the FK
public int Item1Id {get;set;}
public Item1 Item1 {get;set;}
//Not in db. Ignored field in EntityTypeConfiguration
public int Item3Count;
public List<Item3> Item3List { get; set; }
}
public class Item3{
public int Id;
//this is the FK
public int Item2Id {get;set;}
public Item2 Item2 {get;set;}
}
我想返回Item1的列表以及关联的Item2的列表,并加载与Item 2关联的Item3List的COUNT而不加载Item3List。
这是我现在正在做的事情:
public IEnumerable<Item1> GetItems()
{
return base.Query().Include(item1 => item1.Item2List.Select(item2 => item2.Item3List)).ToList();
}
这将向我返回所有3个对象Item1,Item2和Item3的列表。但是我只需要Item3Count中的Item3List计数,而不需要整个Item3List列表。我该如何实现?我在下面尝试过此方法,但是会引发错误。
return base.Query().Include(item1 => item1.Item2List.Select(item2 => new Item2 {
Item3Count = item2.Item3List.Count()
})).ToList();
最佳答案
您想要的是不可能的。当然,您不能在EF LINQ查询中填充未映射的属性,因为这是不映射它的想法。但是你已经知道了。
您真正想做的是这样的:
context.Item1s.Select(item1 => new Item1
{
Id = item1.Id,
Item2s = item1.Item2List.Select(item2 => new Item2List
{
Id = item2.Id,
Item3Count = item2.Item3List.Count()
})
})
但是EF不允许您在EF查询中构造实体对象。
替代方案没有吸引力。
您可以建立匿名类型的结构...
context.Item1s.Select(item1 => new
{
Item1 = item1,
Item2s = item1.Item2List.Select(item2 => new
{
Item2 = item2,
Item3Count = item2.Item3List.Count()
})
})
...并使用它构造一个
Item1
对象的列表,每个对象的Item2List
与Item2
值一起包含Item3Count
值。更好的方法是使用AutoMapper并将实体映射到DTO,但仍然不尽理想:
Mapper.CreateMap<Item1,Item1Dto>();
Mapper.CreateMap<Item2,Item2Dto>();
您可以使用AutoMapper的flattening feature填充
Item3Count
。为此,Item2Dto
应该具有属性Item3ListCount
,并且AutoMapper会将其转换为Item3List.Count()
。关于c# - Entity Framework 嵌套导航属性仅计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37079953/