我期望的结果是:没有任何子节点的记录列表,我的Menu表架构是:ID(长),Name(字符串),Order(int),ParentID(long)
首先选择所有叶级子ID。获取除ParentID列中的值之外的所有ID。然后通过加入leafIDs从菜单中选择
这里是我的代码:
var leafMenuIDs = menus
.Select(m => m.ID)
.Except(menus.Select(m => m.ParentID).Distinct())
.Distinct();
this.ddlMenu.DataSource = from m in menus
join id in leafMenuIDs on m.ID equals id
select new { m.ID, m.Name };
我收到一个错误:在运算符为:
System.collections.generic.IEnumberable<long>
不包含“Except”的定义,而最佳方法重载System.LINQ.queryable.Except<TSource>(System.LINQ.IQueryalbe<TSource>, System.collections.generic.IEnumberable<Tsource>)
包含一些无效参数。
请帮我修复此错误。非常感谢
答案 0 :(得分:2)
如下:
var items = from m in menus
where !menus.Where(c => c.ParentID == m.ID).Any()
select new {
m.ID,
m.Name};
此处,您选择的每个menu
都没有ParentID
引用它。
回应@mmix的评论,这里是生成的SQL(使用Linqpad)
SELECT [t0].[ID], [t0].[Name]
FROM [menus] AS [t0]
WHERE NOT (EXISTS(
SELECT NULL AS [EMPTY]
FROM [menus] AS [t1]
WHERE [t1].[ParentID] = ([t0].[ID])
))
答案 1 :(得分:0)
我认为这里的问题可能是m=>m.ID
&amp; m=>m.ParentID
存在冲突。
尝试将其更改为m=>m.ID
和x=>x.ParentID
(不同的lambda表达式名称)