我有四个表(Locations,Events,MainTags,EventTags),在Events
表和其他三个表中的每一个表之间是多对多关系。
现在我想在同一页面上编辑和显示这些表格中的数据,但我不确定这样做的正确方法。
现在我这样做就是从Events
表中的每个条目中获取id,然后在每个其他表中搜索相同的id,将这些结果保存在列表中稍后在页面上显示它。
(adc
是我与数据库的连接)
List<Event> allEvents = adc.Events.ToList();
List<Location> testTHis = new List<Location>();
foreach (Event eve1 in allEvents)
{
var query_test = from a in adc.Locations where a.Id == eve1.id select a;
testTHis = query_test.ToList();
}
但这似乎是一项相当繁琐的工作而且看起来并不好看,所以我想知道是否有更好的方法可以做到这一点,特别是后来当数据库中有大量数据时这似乎不是一个好主意,因为它需要花费很多时间才能完成。任何人都可以帮我找出更好的解决方案吗?
答案 0 :(得分:1)
您的Event
实体应该公开3个导航属性:
public virtual ICollection<Location> Locations { get; set; }
public virtual ICollection<MainTag> MainTags { get; set; }
public virtual ICollection<EventTag> EventTags { get; set; }
然后,当您查询事件时,告诉EF包含所有标记/事件标记和位置。
context.Events
.Include(x => x.Locations)
.Include(x => x.MainTags)
.Include(x => x.EventTags)
.ToList()
这将在一个查询中一起检索事件及其Locations,MainTags和EventTags。
包含的一个警告词是,每个事件都有自己的标记/位置,即使它被多次引用。
E.g。假设你有2个事件,
当您使用include时,即使它们代表数据库中的相同值,您也会获得 2 个不同的Tag
个对象。
否则,您将启用LazyLoading和ProxyGeneration,并且每次访问其中一个Locations / EventTags / MainTags虚拟属性时,EF都会对数据库进行多次调用。