Ale*_*ADE 8 c# entity-framework entity-framework-6
请假设这个架构:
public class Mammal
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Dog : Mammal
{
public int TailId { get; set; }
public Tail Tail { get; set; }
}
public class Bat : Mammal
{
public int WingId { get; set; }
public Wing Wing { get; set; }
}
public class Buffalo : Mammal
{
public virtual ICollection<Horn> Horns { get; set; }
}
public class Tail
{
public int Id { get; set; }
...
}
public class Wing
{
public int Id { get; set; }
...
}
public class Horn
{
public int Id { get; set; }
...
}
Run Code Online (Sandbox Code Playgroud)
现在,我的背景:
public class MyContext : DbContext
{
public DbSet<Mammal> Mammals { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以,我想只做一个SQL查询,并包含(并加载)所有嵌套实体,如:
var query = myContext.Mammals
.IncludeIfTypeIs<Dog>(d => d.Tail)
.IncludeIfTypeIs<Bat>(b => b.Wing)
.IncludeIfTypeIs<Buffalo>(b => b.Horns)
...
...
;
Run Code Online (Sandbox Code Playgroud)
我知道我可以单独做,但我不想要因为我有很多实体,我需要最小化数据库请求.
我不想使用延迟加载,因为这也会产生许多数据库请求.
怎么实现呢?
你能尝试这样的事情吗:
public static class Extensions
{
public static IQueryable<Mammal> IncludeExtraEntities<Mammal,T>(this IQueryable<Mammal> query, T derivedType) where T :Mammal
{
if (derivedType is Dog)
return query.Include("Tail");
if (derivedType is Bat)
return query.Include("Wing");
return query;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在你的数据库调用中:
var query = myContext.Mammals.IncludeExtraEntities(typeof(Dog));
Run Code Online (Sandbox Code Playgroud)
也许这会起作用。
归档时间: |
|
查看次数: |
907 次 |
最近记录: |