我正在尝试做的是缩小我稍后将用于数据绑定的查询结果。我想得到我的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项目
如果您有任何想法如何有效地做我正在尝试做的事情,我们将非常感谢您的帮助!谢谢!
答案 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();
因为它不要求我使用多个查询变量,尽管我接受的答案与我的答案一样好。