在Linq中,.Select()的对立面是什么?

| 在Linq查询中,如果我想选择除特定属性以外的所有属性,该怎么办? 我不能使用
Select()
并指定除我不想要的属性以外的所有属性,因为我不知道某些属性(我查询抽象类列表)。 我也不能只选择所有属性,因为在序列化X类型的对象时检测到循环引用。(我正在将该对象序列化为Json) 我可以使用任何“ 1”方法或扩展方法吗? 谢谢。     
已邀请:
        不,您不能那样做-根本没有那样的东西。请记住,由于投影,您必须以某种特定类型结束...如果您不知道要选择哪些属性,那么如何拥有这种类型? 如果要查询某个抽象类的列表,是否有任何理由不想只保留对该抽象类实例的引用?将其分为特定属性有什么好处?或者您是否真的想避免稍后再看到这些属性,例如进行数据绑定?     
        如果JSON序列化是您要解决的真正问题,请查看JSON和循环引用异常。一种建议是使用ScriptIgnoreAttribute类,它“指定JavaScriptSerializer不会序列化公共属性或公共字段”。帖子中还有其他一些聪明的方法值得考虑。     
        那么,您到底要实现什么?如果要在序列化之前解决循环问题,为什么不先遍历对象模型,然后将所有反向引用设置为null?
public class MyClass{  
  public List<MyClass> Children {get;set;}  
  public MyClass Parent {get;set;}  

  public void ClearParents(){  
    this.Parent = null;  
    this.Children.ForEach(e => e.ClearParents());  
  }  
}
    
        根据您要谈论的属性数,您最好的选择就是输入您想要的属性。正如Jon Skeet所指出的那样,LINQ中没有任何预建的功能可以满足您的描述,因为这是一项非常不寻常的任务。 话虽这么说,如果您要处理的属性太多,那么编写起来就会很痛苦-例如就像是...
return query.Select(q => new
                   {
                       Prop1 = q.Prop1,
                       Prop2 = q.Prop2,
                       //...
                       Prop3000 = q.Prop3000
                   });
...然后想到两个选择: 使用脚本为您生成代码-可能是通过使用反射来打印类的属性列表并将其C&Ping到您的代码中。 使用PropertyInfo类并按
PropertyInfo.Name
过滤,在实时代码中使用反射。 我已经完成了这两项操作(出于其他原因),所以我知道它们都可以工作。但是,如果可以运行,我强烈建议您使用第一种方法。在实时代码中使用反射将较慢,可能更容易出错,并且在其他开发人员出现时也更难以理解。我使用它的唯一原因是因为我正在上课的班级来自其他地方,并且经常更改。 如果确实使用第一个,则可能需要将代码保留在单独的帮助器类中。没有人希望拥有数十亿行的属性选择来弄乱一种重要的方法。     

要回复问题请先登录注册