【问题标题】:LINQ Query Except not working, List<long?> vs. List<long>LINQ 查询除了不工作,List<long?> vs. List<long>
【发布时间】:2011-07-06 15:14:33
【问题描述】:

我正在尝试缩小查询结果的范围,以便稍后用于数据绑定。我想获取在我的 gridview 中使用的所有 ProgramId,并将它们从我的下拉列表的数据源中删除(即,这样用户就不能选择创建对象并将其插入到与已经使用相同 ProgramId 的 gridview 中存在)

这里有一些代码:

var query = from goals in DataContext.Goals
            select goals;
var query2 = (from goals in query.AsEnumerable()
              select goals.ProgramId).ToList(); //List<long?>
var query3 = (from progs in DataContext.Programs
              select progs.ProgramId).ToList(); //List<long>
var cgps = query3.Except(query2);

我在var cgps = query3.Except(query2); 上遇到了这些错误:

错误 29 'System.Collections.Generic.List' 不包含 'Except' 的定义和最佳扩展方法重载 'System.Linq.ParallelEnumerable.Except(System.Linq.ParallelQuery, System.Collections.Generic. IEnumerable)' 有一些无效参数 C:...\Shmeh\Shmeh\Shmeh\this.aspx.cs 24 226 Project

错误 30 实例参数:无法从 'System.Collections.Generic.List' 转换为 'System.Linq.ParallelQuery' C:...\Shmeh\Shmeh\Shmeh\this.aspx.cs 24 226 项目

如果您知道如何有效地做我想做的事情,任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: c# .net asp.net linq linq-to-sql


    【解决方案1】:

    Except 要求两个序列的类型相同。尝试将long 列表转换为long?

    var query3 = (from progs in DataContext.Programs
                  select (long?)progs.ProgramId).ToList(); //List<long?>
    

    【讨论】:

      【解决方案2】:

      您收到此错误是因为long?long 的类型不同。 Except 要求两个可枚举对象的类型相同。

      您可以做的是从 query2 中删除空值并将 ProgramId 转换为 long

      var query2 = (from goals in query.AsEnumerable()
                    where goals.ProgramId.HasValue
                    select goals.ProgramId.Value).ToList()
      

      【讨论】:

        【解决方案3】:

        试试

        var cgps = query3.Cast<long?>().Except(query2);
        

        【讨论】:

          【解决方案4】:
          var cgps = DataContext.Programs.Select(p => p.ProgramId)
              .Except(DataContext.Goals.Where(g => g.ProgramId.HasValue).Select(g => g.ProgramId.Value));
          

          【讨论】:

            【解决方案5】:

            我不知道这是否适合你。

            var query2 = (from goals in query.AsEnumerable()
                          select goals.ProgramId).ToList() as List<long?>;
            
            var query3 = (from progs in DataContext.Programs
                          select (long?)progs.ProgramId).ToList() as List<long?>;
            

            【讨论】:

              【解决方案6】:

              我不知道他/她为什么删除了他们的答案,但我正在使用这个:

              dropdownlist.DataSource = (
                          from progs in DataContext.Programs
                          where !(from goals in query.AsEnumerable()
                                  select goals.ProgramId)
                                 .Contains(progs.ProgramId)
                          select progs.Name).ToList();
              dropdownlist.DataBind();
              

              因为它不需要我使用多个查询变量,尽管我接受的答案与我的答案一样有效。

              【讨论】:

                猜你喜欢
                • 2012-01-17
                • 1970-01-01
                • 1970-01-01
                • 2021-10-20
                • 1970-01-01
                • 2019-07-31
                • 1970-01-01
                • 1970-01-01
                • 2020-11-14
                相关资源
                最近更新 更多