簡體   English   中英

Linq2Sql中的自引用表

[英]Self-referencing tables in Linq2Sql

我已經在Linq2Sql中的自引用表上看到了很多問題,以及如何急切地加載特定根對象的所有子記錄。 我已經通過訪問所有基礎屬性實現了一個臨時解決方案,但是您可以看到這對性能沒有任何好處。

事實是,所有記錄都使用關聯GUID相互關聯。 下面的例子:

RootElement
- Id: 1
- ParentId: null
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 2
- ParentId: 1
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement2
- Id: 3
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

ChildElement1
- Id: 4
- ParentId: 2
- CorrelationId: 4D68E512-4B55-44f4-BA5A-174B630A03DD

就我而言,我確實可以訪問correlationId,因此我可以通過執行以下查詢來檢索所有記錄:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD'
select element;

但是,當然,我希望通過執行以下查詢將這些元素彼此關聯:

from element in db.Elements
where element.CorrelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD' && element.ParentId == null
select element;

我的問題是:是否有可能將第一個查詢的結果組合為獲取根元素的查詢的某種“緩存機制”?

感謝您的輸入。

J.

對於您要執行的操作或“緩存機制”的含義,我不太清楚。 第二個查詢如何創建任何形式的關聯?

我的第一個預感是GroupBy(x => x.ParentId)父項對結果進行分組,在這種情況下,您可以GroupBy(x => x.ParentId)第一個查詢的結果調用GroupBy(x => x.ParentId)

我的第二個預感是,第二個查詢僅獲取根元素,在這種情況下,您只需對第一個查詢的結果調用Where(x => x.ParentId == null)

如果這不是您想要的,請進一步說明。

編輯:

為了回應您的第一條評論,以下是如何執行兩個查詢:

var correlated_elements = db.Elements.Where(element => element.CollelationId == '4D68E512-4B55-44f4-BA5A-174B630A03DD');
var root_elements = correlated_elements.Where(element => element.ParentId == null);

這只會對數據庫進行一次查詢。 仍然,您的第二個查詢不會創建層次結構-它只返回沒有ParentId的元素。 如果您可以描述所需的層次結構,那么我們可以通過查詢來實現它。

如果不確定對數據庫實際執行了哪些查詢,則可以將SQL輸出到控制台,或使用LINQ-to-SQL Profiler的試用版。

暫無
暫無

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

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