![](/img/trans.png)
[英]LINQ query can I match object type property with another object in where condition
[英]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");
此代碼假定Properties
是Project
的方法。
如果它是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.