【发布时间】:2012-12-19 07:15:43
【问题描述】:
首先,我应该承认我对使用 WMI 或 LINQ 真的不太了解。所以我敢肯定,任何人都不会感到惊讶,因为我遇到了这样的困难!
问题是我试图从同一个 WMI 对象中查询或返回多个值。通常这不会太糟糕,但我发现很难解决这个问题,因为只需要返回与特定数据集匹配的元素。问题是,我必须首先查询 WMI 以获取特定元素或值,然后重新启动查询,按所述元素或值过滤以返回所需的数据集。
我确信我可以遍历 WMI 对象中的所有元素并将它们附加到一个集合中。然后遍历集合,直到我得到我正在寻找的东西,但我仍然有过滤掉所有额外不必要元素的问题。
所以我想我的问题是,对 WMI 对象进行高级搜索的最佳方法是什么?如何优化该过程以便不需要很长时间来检索我正在寻找的信息?
在我的多次搜索中,我发现了一些关于使用 LINQ 的人的参考资料,但我对 LINQ 的了解有限,这意味着我不确定如何在这种情况下使用它,因此非常感谢任何帮助或见解。
这是我到目前为止的想法:
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("SELECT * FROM Win32_NetworkAdapterConfiguration where IPEnabled=true");
IEnumerable<ManagementObject> objects = searcher.Get().Cast<ManagementObject>();
string description = (from o in objects orderby o["IPConnectionMetric"]
select o["Description"].ToString()).FirstOrDefault();
_NICINDEX = (from o in objects orderby o["IPConnectionMetric"]
select o["Index"].ToString()).FirstOrDefault();
_MACADDRESS = (from o in objects orderby o["IPConnectionMetric"]
select o["MACAddress"].ToString()).FirstOrDefault();
_IPADDRESS = (from o in objects orderby o["IPConnectionMetric"]
select o["IPAddress"].ToString()).FirstOrDefault();
_IPV6ADDRESS = (from o in objects orderby o["IPConnectionMetric"]
select o["IPAddress"].ToString()).FirstOrDefault();
_SUBNETMASK = (from o in objects orderby o["IPConnectionMetric"]
select o["IPSubnet"].ToString()).FirstOrDefault();
_GATEWAY = (from o in objects orderby o["IPConnectionMetric"]
select o["DefaultIPGateway"].ToString()).FirstOrDefault();
_DNSSERVER = (from o in objects orderby o["IPConnectionMetric"]
select o["DNSServerSearchOrder"].ToString()).FirstOrDefault();
_DNSSECSVR = (from o in objects orderby o["IPConnectionMetric"]
select o["DNSServerSearchOrder"].ToString()).FirstOrDefault();
return description;
【问题讨论】:
-
根据您正在寻找的信息..您认为“花了这么长时间”您实际上想要实现什么..如果您只想返回描述,那么为什么你的代码中还有其他的东西吗..?
-
您确实意识到您在这里执行了 10 个单独的数据库查询,因为这是您迭代
IQueryable对象的次数。您还可以提取数据的整个结果集,对其进行 10 次不同的排序,然后在 10 次不同的时间中获取相同的第一个值。我并不惊讶它很慢。 -
说实话,返回并不重要,它只是我设置函数的方式,这不是我尝试的唯一查询。这里重要的是,因为我在 WMI 上执行了很多查询,这导致我的应用程序明显变慢。真的,我只是在寻找一种更好的方法来做同样的事情。
-
还有他目前不应该编译的代码,因为所有 _Named 变量都没有正确声明.. 仍在等待 OP 说出他真正想要做什么.. 如果这些值例如 _DNSSECSVR 是声明为局部变量,请拍摄方法定义或您正在使用的未优化方法
-
一种更好的方法是创建一个自定义类并传递您需要的值最好是分开并以较小的块/块来做事情而不是尝试以一种大而缓慢的方式来做所有事情跨度>
标签: c# linq optimization query-optimization wmi