2016-02-07 2 views
0

Я доступа модель Interop, которая имеет следующую структуруLinq запрос для Где условие о взимании имущества Вариант объекта

Проекты представляет собой сборник, содержащий несколько Project объекты

Проект объект имеет государственную собственность и Недвижимость

Свойства коллекция содержит Variant/Объект/Свойство объекты

собственности всегда имеет Имя свойство

Я хочу использовать Linq для:

Найти все проекты Найти первый объект Property (1 или более проектов могут иметь Pro perty.Name == "ИнициаторName". Я просто хочу, чтобы первый объект свойства имел свойство.Name == «IntiatorName». То есть мне все равно, к какому проекту принадлежит объект свойств.

Где Project.State = state_initiated

и Project.Properties, которые имеют Project.Name = "InitiatorName"

Вот 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; } 
} 
+1

Можете ли вы показать свои проекты/проекты/классы свойств в качестве кода? –

+0

Вы можете написать сообщение об ошибке Linq product? –

+0

Вы не показывали класс Project. Как выглядит Project.Properties? –

ответ

0

Заходя SelectMany Свойств вы не получите проекты, как требуется, но свойства.

Попробуйте этот запрос:

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

"Свойства()" не может поставить нуль. Поэтому, если есть сценарий, где это может произойти, пожалуйста, обработайте ситуацию путем нулевой проверки.

+0

Спасибо, похоже, что это ключ. Я просто понял, что после первого объекта Property, который имеет имя, а не проекты. Я обновил вопрос (и вычеркнул исходную строку) – ThunderFrame

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, который, вероятно, так.

+0

Вы получили мой голос, но из любопытства, почему вы выбрали 'OfType' против' Cast' –

+0

@IvanStoev, OP не показывал, как «Project.Properties» выглядит как. Но он сказал: «Коллекция свойств содержит объекты Variant/Object/Property». Поэтому, чтобы быть в безопасности, я предположил, что он может содержать другие типы, чем «Свойство». Было бы легче, если бы OP показал класс «Проект». –

+0

Представленный интерфейс '_Properties' представляет собой типичный COM-перечислимый интерфейс, метод' Item' четко указывает на тип ожидаемого элемента (btw, то же самое можно сказать и для 'ControlCollection' и многих других общих коллекций WinForms). Я лично использовал 'Cast', чтобы не сказать, что ничего не пропущено. Во всяком случае, только с академической точки обсуждения :) –