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

问题描述 投票:0回答:5

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

不能使用

Select()
并指定除我不想要的属性之外的所有属性,因为我不知道其中一些属性(我查询抽象类的列表)。

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

我可以使用任何

Filter()
方法或扩展方法吗?

谢谢。

c# linq
5个回答
23
投票

不,你不能那样做——根本没有那样的事情。请记住,作为投影的结果,您必须最终得到特定类型...如果您不知道要选择什么属性,怎么能拥有这样的类型?

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


3
投票
ScriptIgnoreAttribute Class

,它“指定 JavaScriptSerializer 不会序列化公共属性或公共字段”。帖子中还有一些其他巧妙的方法值得考虑。 根据您正在谈论的房产数量,您最好的选择可能是只输入您确实想要的房产。正如 Jon Skeet 指出的那样,LINQ 中没有预先构建的任何内容可以完成您所描述的操作,因为这是一项非常不寻常的任务。 话虽如此,如果您要处理如此多的属性,那么编写起来会非常痛苦 - 例如类似...


1
投票

...然后我想到了两个选项:

使用脚本为您生成代码 - 可能通过使用反射来打印类属性列表并将其 C&Ping 到您的代码中。
在实时代码中使用反射,使用 

PropertyInfo 类

并按

那么,您到底想要实现什么目标?如果你想在序列化之前解决循环问题,为什么不在序列化之前遍历对象模型,并将所有反向引用设置为空呢?

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()); } }


1
投票

这个问题的更新的

2024
版本可以这样解决;

0
投票

(我正在将对象序列化为 Json)

首先我们用json定义一个模型

NullValueHandling
例如;

[JsonProperty("intProp", NullValueHandling = NullValueHandling.Ignore)] public int? IntProp { get; set; } // it can be any prop with nullable [JsonProperty("stringProp", NullValueHandling = NullValueHandling.Ignore)] public string? StringProp { get; set; } // I said, it can be any prop with nullable [JsonProperty("objectProp", NullValueHandling = NullValueHandling.Ignore)] public SomeObject? ObjectProp { get; set; } // ...any prop with nu... nwm u got the idea...

然后我们得到引用的值,并通过无效删除我们不需要的值;

var test = test.Select(x => { x.ObjectProp = null; return x; }).ToList();
// see the trick here? re-object the object with a prop nullified..

然后如果你用json序列化,最终结果将是除了我们不需要的字段之外的所有字段..

return JsonConvert.SerializeObject(test);

此方法可以通过以下方式实现;

using Newtonsoft.Json;

© www.soinside.com 2019 - 2024. All rights reserved.