簡體   English   中英

Linq查詢變量對象集合的Where條件

[英]Linq query for Where condition on Collection of variant object's property

我正在訪問具有以下結構的Interop模型

項目是包含多個Project對象的集合

Project對象具有State屬性和Properties集合

Properties集合包含Variant / Object / Property對象

屬性始終具有Name屬性

我想使用Linq來:

查找所有項目查找第一個Property對象(一個或多個項目可能具有Property.Name ==“ InitiatorName”。我只想要第一個具有Property.Name ==“ IntiatorName”的Property對象。那是我不在乎屬性對象屬於哪個項目。

其中Project.State = state_initiated

以及具有Project.Name =“ InitiatorName”的Project.Properties

這是我正在嘗試的Linq(C#不喜歡)...我認為我的前幾行是正確的,但是我不確定如何處理變體Property對象。

我可以在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; }
}

您需要執行以下操作:

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這大概就是這樣。

通過訪問Properties的SelectMany,您將無法獲得所需的Projects,而是獲得Properties。

試試這個查詢:

var result = dept.Projects
                .Cast<Project>()
                .Where(
                    project =>
                        project.State == pState.state_initiated &&
                        project.Properties().Any(property => property.Name == "InitiatorName"));

“ Properties()”可能不會傳遞空值。 因此,如果有可能發生的情況,請通過null檢查來處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM