在Linq中,.Select()的反义词是什么?

时间:2011-06-25 13:05:03

标签: c# linq

在Linq查询中,如果我想要选择除特定属性之外的所有属性,我该怎么办?

不能使用Select()并指定除了我不想要的属性之外的所有属性,因为我不知道一些属性(我查询一个摘要列表类)。

我不能只选择所有属性,因为在序列化X类型的对象时会检测到抛出循环引用。(我将对象序列化为Json)

我可以使用任何Filter()方法或某种扩展方法吗?

感谢。

4 个答案:

答案 0 :(得分:20)

不,你不能这样做 - 根本就没有这样的东西。请记住,由于投影,您必须以特定类型结束...如果您不知道要选择哪些属性,那么您如何才能拥有这样的类型?

如果您正在查询某个抽象类的列表,是否有任何理由您不想只保留对该抽象类实例的引用?将它分离成特定属性有什么好处?或者你真的试图避免以后看到这些属性,例如用于数据绑定?

答案 1 :(得分:3)

如果您正在尝试修复JSON序列化是真正的问题,请查看名为JSON and Circular Reference Exception的帖子。一个建议是使用ScriptIgnoreAttribute Class“{指定JavaScriptSerializer不会序列化公共属性或公共字段”。在这个值得考虑的帖子中还有其他一些聪明的方法。

答案 2 :(得分:1)

那么,你想要实现的是什么?如果要在序列化之前解决循环问题,那么为什么不遍历对象模型,并将所有后向引用设置为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());  
  }  
}

答案 3 :(得分:0)

根据您所谈论的属性数量,您最好的选择可能只是输入您想要的属性。正如Jon Skeet所指出的那样,在LINQ中没有任何预先构建的功能可以完成您所描述的内容,因为这是一项非常不寻常的任务。

话虽这么说,如果你正在处理这么多属性,那么写一个巨大的痛苦 - 例如类似......

return query.Select(q => new
                   {
                       Prop1 = q.Prop1,
                       Prop2 = q.Prop2,
                       //...
                       Prop3000 = q.Prop3000
                   });

...然后有两种选择可供选择:

  • 使用脚本为您生成代码 - 可能是通过使用反射打印类属性列表并将其C&amp; Ping到您的代码中。
  • 在实时代码中使用反射,使用PropertyInfo class并按PropertyInfo.Name过滤。

我已经完成了这两个(出于其他原因),所以我知道它们有效。但是,如果你能让它运行,我强烈推荐第一个选项。在实时代码中使用反射将更慢,可能更容易出错,并且当另一个开发人员出现时更难以理解。我使用它的唯一原因是因为我所在的班级来自其他地方,并且经常发生变化。

如果您使用第一个,可能希望将代码保存在单独的帮助程序类中。没有人希望数十亿行的财产选择混淆了一种重要的方法。

相关问题