我有一个由一个由匿名对象组成的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) =>
{
?????????????
};
答案 0 :(得分:3)
如何将其投射到动态? Smth喜欢:
var dynamicItem = item as dynamic;
return dynamicItem.FirstName == "Heines";
否则你可以查看这个答案以转换为匿名类型 - 但是,正如海报所提到的,在大多数情况下这可能没有多大意义: - )
答案 1 :(得分:2)
这应该有效 -
view.Filter = (item) =>
{
dynamic anyonymousItem = item;
// Your condition here
return anyonymousItem.CollegeID == 1;
};
答案 2 :(得分:1)
在我看来,使用dynamc并不是最好的选择。您应该创建一个包含属性的类(例如Player),然后将查询更改为select new Player()
。然后,在过滤器中,您可以检查对象是否为Player
类型,并在必要时进行投射。
像这样,您不必依赖动态调度并获得静态类型的所有好处(例如,如果您错误地写入属性名称或更改其名称,则编译时错误。)