Каков наилучший способ сделать динамический оператор LINQ-to-XML? - PullRequest
0 голосов
/ 09 июня 2009

Я загружаю данные XML в объект с помощью этого оператора LINQ:

var smartFormFields = from smartFormField in xmlDoc.Descendants("smartFormField")
                      select new Models.SmartFormField
                      {
                          IdCode = smartFormField.Element("idCode").Value,
                          Label = smartFormField.Element("label").Value,
                          FieldType = smartFormField.Element("fieldType").Value,
                          DisplayStatus = smartFormField.Element("displayStatus").Value,
                          RequiredStatus = smartFormField.Element("requiredStatus").Value,
                          DisplayColumn = (int)smartFormField.Element("displayColumn"),
                          DisplayOrder = (int)smartFormField.Element("displayOrder"),
                          Description = smartFormField.Element("description").Value,
                          Example = smartFormField.Element("example").Value,
                          ControlType = smartFormField.Element("controlType").Value,
                          AutoSuggestDataSource = smartFormField.Element("autoSuggestDataSource").Value
                      };

Однако мой оператор WHERE (и ORDERBY) будет меняться каждый раз, например,

это может быть так:

var smartFormFields = from smartFormField in xmlDoc.Descendants("field")
                      where smartFormField.Element("IdCode").Value == "lastName"
                      select new Models.SmartFormField
                      {...

это может быть так:

var smartFormFields = from smartFormField in xmlDoc.Descendants("field")
                      where (int)smartFormField.Element("DisplayOrder").Value > 50
                      select new Models.SmartFormField
                      {...

и т.д..

Как я могу поместить оператор Where в переменную, что-то вроде этого:

псевдокод:

string whereStatement = "where (int)smartFormField.Element(\"DisplayOrder\").Value > 50";

var smartFormFields = from smartFormField in xmlDoc.Descendants("field")
                      &&whereStatement
                      select new Models.SmartFormField
                      {...

1 Ответ

3 голосов
/ 09 июня 2009

Вы должны выразить это как строку? Если вы рады предоставить его в качестве делегата, вы можете использовать:

// Just as one example of a where clause
Func<XElement, bool> whereClause = sff => (int) sff.Element("DisplayOrder").Value > 50;

var smartFormFields = xmlDoc.Descendants("field")
                            .Where(whereClause)
                            .Select(sff => 
                                new Models.SmartFormField
                                {
                                    IdCode = sff.Element("idCode").Value,
                                    ...
                                });

Если вы поместите это в метод, тогда вам просто нужно использовать лямбда-выражение:

var fields = GetFormFields(sff => (int) sff.Element("DisplayOrder").Value > 50);

и т.д.

Это позволит вам легко указывать разные значения для разных вызовов, но вы не сможете просто поместить выражения в текстовый файл без дополнительной работы. Каковы ваши реальные требования здесь? Не могли бы вы иметь карту «имя фильтра» на Func<XElement, bool>, а затем прочитать имена фильтров во время выполнения? Или вам действительно нужно, чтобы полностью контролировалось во время выполнения произвольным образом?

(Обратите внимание, что порядок аналогичен, но, возможно, немного сложнее ... давайте сначала отсортируем фильтрацию.)

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