cod*_*mav 5 .net c# entity-framework navigation-properties
我有三个模型课
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;}
}
Run Code Online (Sandbox Code Playgroud)
我想返回Item1的列表以及关联的Item2的列表,并加载与Item 2关联的Item3List的COUNT而不加载Item3List。
这是我现在正在做的事情:
public IEnumerable<Item1> GetItems()
{
return base.Query().Include(item1 => item1.Item2List.Select(item2 => item2.Item3List)).ToList();
}
Run Code Online (Sandbox Code Playgroud)
这将向我返回所有3个对象Item1,Item2和Item3的列表。但是我只需要Item3Count中的Item3List计数,而不需要整个Item3List列表。我该如何实现?我在下面尝试过此方法,但是会引发错误。
return base.Query().Include(item1 => item1.Item2List.Select(item2 => new Item2 {
Item3Count = item2.Item3List.Count()
})).ToList();
Run Code Online (Sandbox Code Playgroud)
包含路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用“选择”运算符作为集合导航属性。参数名称:路径
你想要的东西是不可能的。当然,您不能在 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()
})
})
Run Code Online (Sandbox Code Playgroud)
但 EF 不允许您在 EF 查询中构造实体对象。
替代方案没有吸引力。
您可以构建匿名类型的结构......
context.Item1s.Select(item1 => new
{
Item1 = item1,
Item2s = item1.Item2List.Select(item2 => new
{
Item2 = item2,
Item3Count = item2.Item3List.Count()
})
})
Run Code Online (Sandbox Code Playgroud)
...并使用它来构造一个对象列表Item1
,每个对象都有其Item2List
s of Item2
sItem3Count
值。
更好,但仍不接近理想的是使用 AutoMapper 并将实体映射到 DTO:
Mapper.CreateMap<Item1,Item1Dto>();
Mapper.CreateMap<Item2,Item2Dto>();
Run Code Online (Sandbox Code Playgroud)
您可以使用 AutoMapper 的展平功能来填充Item3Count
. 为此,Item2Dto
应该有一个属性Item3ListCount
,AutoMapper 会将其转换为Item3List.Count()
.
归档时间: |
|
查看次数: |
929 次 |
最近记录: |