LINQ查询除了不工作外,List <long?> vs. List <long> </long> </long?>

时间:2011-07-06 15:14:34

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

我正在尝试做的是缩小我稍后将用于数据绑定的查询结果。我想得到我的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项目

     

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

如果您有任何想法如何有效地做我正在尝试做的事情,我们将非常感谢您的帮助!谢谢!

6 个答案:

答案 0 :(得分:9)

Except要求序列属于同一类型。尝试将long列表转换为long?

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

var cgps = DataContext.Programs.Select(p => p.ProgramId)
    .Except(DataContext.Goals.Where(g => g.ProgramId.HasValue).Select(g => g.ProgramId.Value));

答案 4 :(得分:0)

我不知道这是否适合你。

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?>;

答案 5 :(得分:0)

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

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();

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