如何使用LINQ和"In"筛选内存中的数据对象声明
本文关键字:quot 声明 对象 内存 数据 In 何使用 LINQ 筛选 | 更新日期: 2023-09-27 18:11:23
我正在尝试填充我的DataGrid
dgGoals.ItemsSource = GetGoals(new int[] { 1, 2, 3 });
这是一个In Memory对象,它从另一个进程加载数据
static ObservableCollection<Goal> goals = new ObservableCollection<Goal>();
我尝试使用这个示例Linq版本的SQL "IN"语句,但lambda和LINQ语句都返回null,当它应该是100条记录。
public static ObservableCollection<Goal> GetGoals(int[] selectedGoalKey)
{
//goals has 170 records at this point
//selectedGoalKey has 3 items (1,2,3)
//goals has 100 records with Goal_Key of 1,2 or 3
//Returns null
return goals.Where(f => selectedGoalKey.Contains(f.Goal_Key)) as ObservableCollection<Goal>;
//Returns null
return (from g in _Goals
where selectedGoalKey.Contains(g.Goal_Key)
select g) as ObservableCollection<Goal>;
}
编辑修复,现在工作
public static IEnumerable<Goal> GetGoals(int[] selectedGoalKey)
{
//goals has 170 records at this point
//selectedGoalKey has 3 items (1,2,3)
//goals has 100 records with Goal_Key of 1,2 or 3
//Now returns 100 records
return goals.Where(f => selectedGoalKey.Contains(f.Goal_Key));
//Now returns 100 records
return (from g in _Goals
where selectedGoalKey.Contains(g.Goal_Key)
select g);
}
问题是结果不是ObservableCollection<Goal>
,而是IEnumerable<Goal>
。这就是为什么你收到null
。
你可以这样做:
return new ObservableCollecion<Goal>
(goals.Where(f => selectedGoalKey.Contains(f.Goal_Key)));
使用"x" as "some type"
将对象转换为该类型,在这种情况下它不能返回null
。您要做的是创建一个新的ObservableCollecion
,并将linq查询的结果传递给它。
退出MSDN:
as操作符类似于强制转换操作。但是,如果转换不可能,则as返回null而不是引发异常。考虑下面的例子:
Jmyster从一开始就使用ObservableCollection不是一个好主意
即使它继承自Collection,它也有比处理简单过滤器所需的更多的锅炉板。(比如通知事件等)
我强烈建议你使用简单的List来进行所有的过滤,并且只在算法的最后将它们全部放在ObservableCollection类中。
这个简单的行为将防止您处理与上下文无关的问题。