我有一個內存List<TreeNode>
。是否有可能使用linq來選擇所有葉節點?Linq左外連接到同一個列表上找到葉節點
的SQL會是這個樣子:
SELECT
t1.Name
FROM
Tree t1
LEFT JOIN Tree t2
ON t1.UserId = t2.ParentId
WHERE
t2.UserId is null
,我已經得到的最接近的(我還需要篩選出空值):
var test = from t1 in list
join t2 in list
on t1.UserId equals t2.ParentId into g
from result in g.DefaultIfEmpty()
select new {
t1.Name
};
將會產生正確的SQL (當在linqpad中測試時)沒有where子句。如果我嘗試在t2 == null的地方過濾結果,我無法訪問t2選擇匿名對象的地方。我是否需要創建列表的副本並加入到該列表中?
應該澄清 - 生產中linqpad – woggles 2011-06-06 12:27:40
這會產生運行查詢時,正確的SQL'選擇[T 0] [名稱] FROM [Tree] AS [t0] LEFT OUTER JOIN [Tree] AS [t1] ON(([t0]。[UserId])= [t1]。[ParentId])AND(0 = 1)' – woggles 2011-06-06 12:37:00
@護目鏡:這似乎很奇怪......但它在你的usi實際場景中有什麼作用將它列入清單?你的情況下'UserId'的類型是什麼? – 2011-06-06 13:22:12