Linq查询变量对象属性集合的Where条件

时间:2016-02-07 11:57:43

标签: c# linq com-interop

我正在访问具有以下结构的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; }
}

2 个答案:

答案 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");

此代码假设PropertiesProject的方法。

如果属于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。因此,如果存在可能发生的情况,请通过空检查处理该情况。