Получение атрибута атрибута в FetchXML с использованием фильтров

Это мой FetchXML...

<fetch version="1.0" mapping="logical">
    <entity name="cs_testparameter" >
        <attribute name="cs_testcalculation" />
    </entity>
</fetch>

который возвращает следующее:

<resultset morerecords="0">
  <result>
    <cs_testcalculation name="Addition" formattedvalue="717640000">717640000</cs_testcalculation>
  </result>
  <result>
    <cs_testcalculation name="Subtraction" formattedvalue="717640001">717640001</cs_testcalculation>
  </result>
  <result>
    <cs_testcalculation name="Multiplication" formattedvalue="717640002">717640002</cs_testcalculation>
  </result>
  <result>
    <cs_testcalculation name="Division" formattedvalue="717640003">717640003</cs_testcalculation>
  </result>
</resultset>

Я хотел бы отфильтровать свои результаты, чтобы он возвращал только TestParameter объектов, у которых имя атрибута testCalculation равно, например, Addition. Как бы я это сделал?

Я знаю, что могу фильтровать, используя числовое значение, используя...

<fetch version="1.0" mapping="logical">
    <entity name="cs_testparameter" >
        <attribute name="cs_testcalculation" />
        <filter type="and">
            <condition attribute="cs_testcalculation" operator="eq" value="717640000" />
        </filter>
    </entity>
</fetch>

... но я бы предпочел не использовать числовое значение, а фильтровать по самому имени. Это возможно?


Редактировать: В конце концов, я буду использовать это, чтобы сделать что-то вроде...

string fetchQuery = @"--my fetchXML here...--";
FetchExpression fetchTestParameters = new FetchExpression(fetchQuery);
EntityCollection testParameters = context.RetrieveMultiple(fetchTestParameters);

foreach (var testParameter in testParameters.Entities)
{
    switch (testParameter.cs_testcalculation["name"])
    {
      case "Addition":
        //do something...
      case "Subtraction":
        //do something else...
      ...
    }
}

person kei    schedule 20.11.2015    source источник
comment
Как вы выполняете свой fetxml? использование retrievemultiple всегда даст вам коллекцию результатов, где извлечение вернет сущность xml, которую вы действительно хотите.   -  person Shane_Yo    schedule 23.11.2015
comment
Я не знаю никакого способа получить результаты, используя значения имени набора параметров, однако, если вы объясните свою цель, почему вы хотите получить результаты, используя значение имени набора параметров? Любой может предложить обходной путь для этого.   -  person Khadim Ali    schedule 23.11.2015
comment
@Shane_Yo Я использую RetrieveMultiple   -  person kei    schedule 23.11.2015
comment
@AliLee Я обновил свой вопрос и добавил, какова моя цель в конце.   -  person kei    schedule 23.11.2015


Ответы (2)


Отвечая на ваше недавнее редактирование:

Вы просто используете перечисления, чтобы сделать код более читабельным и масштабируемым, но по сути вы сравниваете числа. Правильным ответом будет «Это невозможно», но ваш подход к решению этой проблемы правильный.

Другой способ сделать это — использовать FormattedValues, который позволяет запрашивать имя вместо значения.

Код поздней привязки:

entity.FormattedValues["cs_TestCalculation"]

or

entity.GetFormattedAttributeValue["cs_TestCalculation"]
person Sxntk    schedule 23.11.2015

Я нашел обходной путь для того, что я делаю:

  • мой FetchXML все тот же

  • Я создал перечисления наборов параметров с помощью crmsvcutil и добавил их в свой проект.

  • мой foreach теперь выглядит так:


foreach (var testParameter in testParameters.Entities)
{
    switch (((cs_testparameter) testParameter).cs_TestCalculation.Value)
    {
      case (int)cs_testcalculation.Addition:
        //do something...
      case (int)cs_testcalculation.Subtraction:
        //do something else...
      ...
    }
}
person kei    schedule 23.11.2015
comment
Замечательно. Но мне просто интересно, почему вы не использовали целочисленные значения набора параметров (жестко закодированные) в операторе swtich ... case просто вместо этого длинного обходного пути? - person Khadim Ali; 24.11.2015
comment
@AliLee Целочисленные значения не имеют смысла для того, кто берет на себя код. Значения также могут полностью измениться. Если есть изменения, было бы лучше обновить ранние классы связанных типов и наборов параметров, а не основной код. - person kei; 24.11.2015
comment
Я помню (нужно подтвердить), если мы изменим целочисленные значения набора параметров, существующие значения в записях сущностей станут недействительными. Другими словами, это не будет каскадным изменением. С другой стороны, значения имен с большей вероятностью будут изменены из-за ошибок правописания, улучшения имени и т. д. Лично я считаю, что использование значений имен в коде для выполнения задач — не лучший подход. - person Khadim Ali; 25.11.2015