簡體   English   中英

Linq 查詢特定場景

[英]Linq Query for a particular scenario

 Class Demo
 {
  public int Id{get;set;};
  public string Name{get;set;}
  public int Parent{get;set;};
  public IList<Demo> children{get;set;}
 }

現在我的代碼返回列表演示。 數據是三層嵌套的。 我的意思是 List 可以再次包含 Children1 基於與嵌套級別 Parent 匹配的每個上層 Id。 它又向下一層,其中上層 Children1 每個 ID 匹配嵌套的 Parent 和另一個 Demo 列表。 如何從中編寫優化查詢。 *

List Demos 將包含大量數據,然后每個 Demo Id 與 Parent 匹配,如果匹配子列表(假設 children1)被獲取,然后基於 Children 1 中與 Id 與 Parent 匹配的每個孩子,填充另一個子列表。

您可以使用遞歸實現您想要的結果。 基本上有一個 function 在 IList 的 1 級上執行查詢。 然后它將調用自己(與當前正在執行的相同的 function),直到不再有子代。

由於除了如何查詢潛在的無限數量的孩子的問題之外沒有上下文,我只會深入研究遞歸問題而不是優化部分。 如何優化無限遞歸查詢是一個完全不同的問題。

它很可能看起來像這樣:

IList<Demo> QueryDemo(Demo current, int parentId)
{
    if (current.Id != parentId)
        return new List<Demo>();

    List<Demo> acceptedChildren = new();

    foreach (var child in current.children)
    {
        acceptedChildren.AddRange(QueryDemo(child, current.Id));
    }

    return acceptedChildren;
}

既然你說 Linq 到 SQL,我假設這有一個帶有自連接的后備表,這已經是定義此類結構的優化方式。 If you generate your Linq To SQL model from such a table then your model would already have navigational properties for 'parent' and 'children'. SQL 服務器示例數據庫的雇員表就是一個很好的例子。 基於它的 model 你會有類似的東西:

var e = Employees.Select(em => new {
    em.EmployeeID,
    em.FirstName,
    em.LastName,
    em.ReportsToChildren
});

這將生成這個 SQL:

SELECT [t0].[EmployeeID], [t0].[FirstName], [t0].[LastName], [t1].[EmployeeID] AS [EmployeeID2], [t1].[LastName] AS [LastName2], [t1].[FirstName] AS [FirstName2], [t1].[Title], [t1].[TitleOfCourtesy], [t1].[BirthDate], [t1].[HireDate], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[HomePhone], [t1].[Extension], [t1].[Photo], [t1].[Notes], [t1].[ReportsTo], [t1].[PhotoPath], (
    SELECT COUNT(*)
    FROM [Employees] AS [t2]
    WHERE [t2].[ReportsTo] = [t0].[EmployeeID]
    ) AS [value]
FROM [Employees] AS [t0]
LEFT OUTER JOIN [Employees] AS [t1] ON [t1].[ReportsTo] = [t0].[EmployeeID]
ORDER BY [t0].[EmployeeID], [t1].[EmployeeID]

在此使用 ToList() 是枚舉的一個小細節。

注意:使用 LinqPad 之類的實用程序,您可以快速輕松地進行測試。

暫無
暫無

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

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