我正在访问具有以下结构的Interop模型
项目是一个包含多个项目对象
的集合Project 对象具有State属性和 Properties 集合
属性集合包含 Variant / Object / Property 对象
属性始终具有名称属性
我想使用Linq:
查找所有项目查找第一个Property对象(一个或多个项目可能有一个Property.Name ==" InitiatorName"。我只想要第一个具有Property的Property Object .Name ==" IntiatorName"。这就是我不关心属性对象属于哪个项目。Project.State = state_initiated
以及具有Project.Name =" InitiatorName"
的Project.Properties
这是我正在尝试的Linq(C#并不喜欢)......我想我的第一行是正确的,但我不确定如何处理variant属性对象。
我可以在Linq中做些什么,或者我是否必须枚举所有属性对象?
var result = dept.Projects
.Cast<Project>()
.Where(project => project.State == pState.state_initiated)
.SelectMany(project => project.Properties())
.Where(property => property.Name == "InitiatorName");
这是属性接口的Interop签名:
public interface _Properties : IEnumerable
{
[DispId(1)]
Application Application { get; }
[DispId(40)]
int Count { get; }
[DispId(2)]
object Parent { get; }
[DispId(-4)]
[TypeLibFunc(1)]
IEnumerator GetEnumerator();
[DispId(0)]
Property Item(object index);
}
属性签名如下所示:
public interface Property
{
[DispId(41)]
Properties Collection { get; }
[DispId(40)]
string Name { get; }
[DispId(1)]
Properties Parent { get; }
[DispId(0)]
object Value { get; set; }
}
答案 0 :(得分:1)
你需要做这样的事情:
var result = dept.Projects
.Cast<Project>()
.Where(project => project.State == pState.state_initiated)
.SelectMany(project => project.Properties().OfType<Property>())
.FirstOrDefault(property => property.Name == "InitiatorName");
此代码假设Properties
是Project
的方法。
如果属于Project
,则您需要使用.Properties.OfType<Property>()
代替.Properties().OfType<Property>()
。
如果您确定Cast
仅包含类型为TypeOf
的对象,则可能需要使用Properties
而不是Property
。
答案 1 :(得分:0)
通过访问属性的SelectMany,您不会获得所需的项目,而是属性。
尝试此查询:
var result = dept.Projects
.Cast<Project>()
.Where(
project =>
project.State == pState.state_initiated &&
project.Properties().Any(property => property.Name == "InitiatorName"));
“Properties()”可能不会传递null。因此,如果存在可能发生的情况,请通过空检查处理该情况。