我使用的数据库第一种方法。我有我的数据库中下表:
[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 }
编辑对象列表UI需要以下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和国家IDS)。
是否有可能选择仅使用3 SELECT查询这个信息?这很容易在SQL做的,但我想知道我可以在实体框架做到这一点。
UPD:在SQL我只想写3个select语句:
SELECT * FROM [Object]
SELECT * FROM [ObjectXCountries]
SELECT * FROM [ObjectXUser]
从调用这个代码查询,然后在对象ID参与三项结果集。也许有一些方法,使在实体的上下文表[ObjectXCountries]和[ObjectXUser]可用的,所以我可以写一个类似的代码?
UPD:我使用实体框架6.2。
好吧,谷歌搜索了很多,尝试了不同的方式之后,我发现了一个简单的工作方案。
多个查询延迟加载的结果。如果我“包含”我的导航性能,将在一个查询得到的一切。这可以用下面的代码来实现:
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()
});