使用匿名类型过滤ICollectionView但需要Predicate <object>?</object>

时间:2012-08-19 03:00:38

标签: c# .net wpf

我有一个由一个由匿名对象组成的LINQ to Entities查询构建的ICollectionView ...我想对这个集合应用过滤器,但是Filter属性需要一个Predicate

如何在此匿名类型集合上应用过滤器,我该怎么办?

var playerDatabase = (from p in NFLDataContext.DimPlayers
                    join c in NFLDataContext.DimColleges on p.CollegeID equals c.CollegeID
                    join pos in NFLDataContext.DimPositions on p.PositionID equals pos.PositionID
                    select new
                    {
                        FirstName = p.FirstName,
                        LastName = p.LastName,
                        FullName = p.FirstName + " " + p.LastName,
                        CollegeName = c.CollegeName,
                        CollegeID = p.CollegeID,
                        PositionCode = pos.PositionCode,
                        PositionName = pos.PositionName,
                        PositionID = p.PositionID,
                        PlayerID = p.PlayerID
                    }).ToList();


        dgPlayers.ItemsSource = playerDatabase;

在事件处理程序的其他地方......

        string SomeFilterCondition;
        ICollectionView view = CollectionViewSource.GetDefaultView(dgPlayers.ItemsSource);
        view.Filter = (item) =>
        {
             ?????????????
        };

3 个答案:

答案 0 :(得分:3)

如何将其投射到动态? Smth喜欢:

var dynamicItem = item as dynamic;
return dynamicItem.FirstName == "Heines";

否则你可以查看这个答案以转换为匿名类型 - 但是,正如海报所提到的,在大多数情况下这可能没有多大意义: - )

https://stackoverflow.com/a/1409776/454272

答案 1 :(得分:2)

这应该有效 -

view.Filter = (item) =>
        {
             dynamic anyonymousItem = item;
             // Your condition here
             return anyonymousItem.CollegeID == 1;
        };

答案 2 :(得分:1)

在我看来,使用dynamc并不是最好的选择。您应该创建一个包含属性的类(例如Player),然后将查询更改为select new Player()。然后,在过滤器中,您可以检查对象是否为Player类型,并在必要时进行投射。

像这样,您不必依赖动态调度并获得静态类型的所有好处(例如,如果您错误地写入属性名称或更改其名称,则编译时错误。)