如何解决这个LINQ错误

时间:2011-03-31 11:28:24

标签: linq linq-to-sql

我期望的结果是:没有任何子节点的记录列表,我的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>)包含一些无效参数。

请帮我修复此错误。非常感谢

2 个答案:

答案 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.IDx=>x.ParentID(不同的lambda表达式名称)