簡體   English   中英

如何使用Entity Framework有效選擇實體和相關實體的ID

[英]How to effectively select entity and ids of related entities with 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 }

要編輯對象列表,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和國家/地區ID)。

是否可以僅使用3個選擇查詢來選擇此信息? 在sql中很容易做到,但是我想知道如何在Entity Framework中做到這一點。

UPD:在SQL中,我只寫3條select語句:

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

從代碼中調用此查詢,然后在ObjectID上連接三個結果集。 也許有某種方法可以使表[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()
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM