如何使用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);
}

如何使用LINQ和"In"筛选内存中的数据对象声明

问题是结果不是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类中。
这个简单的行为将防止您处理与上下文无关的问题。