我有三个模型课

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对象的列表,每个对象的Item2ListItem2值一起包含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/

10-12 15:54