Найти свойства, где параметр отсутствует в списке <> вложенных свойств - PullRequest
0 голосов
/ 19 марта 2020

Во-первых, у меня есть перечисление как

internal enum property_name
{
  label = 1
  ,
  from = 2
  ,
  to = 3
  ,
  forwardTo = 4
}

Во-вторых, у меня есть класс, который ссылается на перечисление на самом внутреннем вложенном классе _property

internal class cls_xml_filters
{
  internal string title { get; set; }

  internal List<_entry> entry { get; set; }

  internal class _entry
  {
    internal string category { get; set; }

    internal string id { get; set; }

    internal DateTime updated { get; set; }

    internal List<_property> property { get; set; }

    internal class _property
    {
      internal property_name name { get; set; }

      internal string value { get; set; }
    }
  }
}

Класс _property может иметь один или много записей, и _property.name не всегда содержит все значения enum property_name.

Я хочу найти все уникальные _entries.id, где имя_свойства не существует в _entry._property.name. Я уже сделал запрос, в котором я нахожу все записи, где _property.name существует в _entry

List<string> filters_search_results = var_xml_filters.entry
  .SelectMany(m => m.property
    .Where(w => w.name == find_property_name), (m, w) => string.Join(" : ", new[] { m.id, w.value }))
  .Distinct()
  .OrderBy(o => o)
  .ToList();

, но я понятия не имею, как сделать обратное, поскольку я не могу использовать! Содержит, поскольку это принесет вернуть все свойства всех записей, которые не равны параметру find_property_name; find_property_name имеет тип имя_свойства enum. Если я не выполняю приведение ToString () к w.name, я вообще не имею доступа к Contains (), потому что property_name не содержит определения для Contains (), и если я выполняю приведение ToString (), как показано ниже , он возвращает все свойства

List<string> filters_search_results= var_xml_filters.entry
  .SelectMany(m => m.property.Where(w => !w.name.ToString().Contains(find_property_name.ToString())), (m, w) => string.Join(" : ", new[] { m.id  , "no value" }))
  .Distinct()
  .OrderBy(o => o)
  .ToList();

Итак, чтобы уточнить мой вопрос:

Если у меня есть

property_name find_property_name = property_name.from;

Я хочу только _entry. id, если ни одно из имен List <_property> не содержит find_property_name.

Я не знаю, как это сделать; пожалуйста помоги. Спасибо.

РЕДАКТИРОВАТЬ

Пример XML (с удалением реальных значений и заменой их фиктивными данными)

<cls_xml_filters>
  <title>title</title>
  <entry>
    <category>category</category>
    <id>001</id>
    <updated>2020-03-14T20:04:34Z</updated>
    <property>
      <name>label</name>
      <value>value</value>
    </property>
    <property>
      <name>from</name>
      <value>value</value>
    </property>
    <property>
      <name>to</name>
      <value>value</value>
    </property>
    <property>
      <name>forward</name>
      <value>value</value>
    </property>
  </entry>
  <entry>
    <category>category</category>
    <id>002</id>
    <updated>2020-03-14T20:04:34Z</updated>
    <property>
      <name>from</name>
      <value>value</value>
    </property>
    <property>
      <name>to</name>
      <value>value</value>
    </property>
  </entry>
  <entry>
    <category>category</category>
    <id>003</id>
    <updated>2020-03-14T20:04:34Z</updated>
    <property>
      <name>forward</name>
      <value>value</value>
    </property>
  </entry>
</cls_xml_filters>

В примере выше, я ищу найти _entry.id, где ни одно из свойств не содержит "label". Он должен вернуть List<string> со значениями 002 и 003, потому что ни одно из свойств в этих двух не содержит никаких свойств, имеющих перечисление enum.

1 Ответ

1 голос
/ 19 марта 2020

Я изменил ваш query, добавив фильтр where перед SelectMany, как показано в следующем коде: property_name find_property_name = property_name.label;

1 - Результат будет таким: id: значение

List<string> filters_search_results2 = var_xml_filters.entry
    .Where(m => !m.property.Select(p => p.name).Contains(find_property_name.ToString()))
    .SelectMany(m => m.property, (m, w) => $"{m.id} : {w.value}")
    .Distinct()
    .OrderBy(o => o)
    .ToList();

** Демо *

foreach(string item in filters_search_results2)
{
    Console.WriteLine(item);
}

Результат

002 : value
003 : value

2 - Результат будет выглядеть так: id

List<string> filters_search_results3 = var_xml_filters.entry
    .Where(m => !m.property.Select(p => p.name).Contains(find_property_name.ToString()))
    .SelectMany(m => m.property, (m, w) => $"{m.id}")
    .Distinct()
    .OrderBy(o => o)
    .ToList();

Демо

foreach(string item in filters_search_results3)
{
    Console.WriteLine(item);
}

Результат

002
003

Обратите внимание, что я изменил name введите string класса _property.

Надеюсь, это поможет вам решить проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...