如何使用Entity Framework有效地选择实体和相关实体的ID

时间:2019-02-05 08:34:10

标签: c# .net entity-framework

我使用数据库优先方法。我的数据库中有以下表格:

[Country](ID, Name)
[Status](ID, Name)
[User](ID, Name)
[Object](ID, StatusID, Name)
[ObjectXCountries](ObjectID, CountryID)
[ObjectXUser](ObjectID, UserID)

现在,实体框架创建以下实体:

Country { ID, Name }
User { ID, Name }
Status { ID, Name }
Object { ID, StatusID, Status, Name, Countries, Users }

要编辑对象列表,用户界面需要以下JSON结构:

{ 
   cnt: [ { id: 1, name: 'some country', ...}, ],
   usr: [ { id: 1, name: 'some user', ...}, ],
   st: [ { id: 1, name: 'some status', ...}, ],
   objects: [ { id: 1, name: 'some name', st: 1, cnt: [ 1, 2, 3 ], usr: [ 1, 2, 3] }, ... ] 
}

获取国家,用户和状态的列表很简单,但是如何获取ID与之连接的对象的列表呢?现在,我有以下代码,这会导致查询效率非常低:

ctx.Object.Select(rec => new ObjectDTO {
   ID = rec.ID,
   Name = rec.Name,
   StatusID = rec.StatusID,
   UserIDs = rec.Users.Select(usr => usr.ID).ToArray(),
   CountryIDs = rec.Countries.Select(cnt => cnt.ID).ToArray()
});

它将转换为sql,这取决于对象的数量,它选择所有对象,然后为每个对象创建一个选择查询以获取用户ID和国家/地区的列表。如果我有一百个对象,它将导致101个查询。第一个获取对象列表,第100个获取连接的ID。 (UPD:201个查询,对于每个实体,还有两个附加查询以获取用户ID和国家/地区ID)。

是否可以仅使用3个选择查询来选择此信息? 在sql中很容易做到,但是我想知道如何在Entity Framework中做到这一点。

UPD:在SQL中,我只需编写3条select语句:

SELECT * FROM [Object]
SELECT * FROM [ObjectXCountries]
SELECT * FROM [ObjectXUser]

从代码中调用此查询,然后在ObjectID上加入三个结果集。也许有某种方法可以使表[ObjectXCountries]和[ObjectXUser]在实体上下文中可用,所以我可以编写类似的代码?

UPD::我使用的是Entity Framework 6.2。

1 个答案:

答案 0 :(得分:0)

好吧,经过大量的搜索并尝试了不同的方式之后,我找到了一个简单且可行的解决方案。

多个查询是延迟加载的结果。如果我“包括”我的导航属性,它将在一个查询中获得所有信息。这可以通过以下代码实现:

ctx
.Object
.Include("Users")
.Include("Countries")
.Select(rec => new ObjectDTO {
   ID = rec.ID,
   Name = rec.Name,
   StatusID = rec.StatusID,
   UserIDs = rec.Users.Select(usr => usr.ID).ToArray(),
   CountryIDs = rec.Countries.Select(cnt => cnt.ID).ToArray()
});