Я работаю над сервисом ASP.NET Web Api, где один из действий контроллера принимает строку JSON с 0 или более ключами: пары значений для поиска по коллекции объектов. Из-за этого я не знаю, какие имена полей будут в запросе для фильтрации коллекции.Динамическое выражение LINQ, где неизвестно имя поля
Теперь у меня есть код, который будет строить динамический запрос путем объединения выражений WHERE на основе предоставленных данных. Проблема в этом случае заключается в том, что я не только не знаю имя поля, которое нужно отфильтровать, список полей и их значений хранятся в коллекции внутри каждого объекта - и объекты в этой коллекции имеют только два свойства: Имя и стоимость.
Данные десериализуются из множества XML-файлов, которые я не контролирую (поэтому не могу изменить форматирование), а список полей, содержащихся в каждом файле, может быть другим. (см. определение класса ниже).
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public class Bug
{
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public int ID { get; set; }
[System.Xml.Serialization.XmlElementAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public DateTime ChangedDate { get; set; }
[System.Xml.Serialization.XmlArrayAttribute(Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("Field", typeof(BugField), Form = System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable = false)]
public List<BugField> Fields {get; set;}
}
Если я запускаю следующий запрос все работает нормально - я получаю результат я ищу на основе запроса JSON - однако этот запрос только поиск на одном поле и одно значение, а запрос имеет индекс правильного поле закодированного;) (FYI - ITEMLIST коллекция, созданная ранее, без фильтрации)
itemList = (List<Bug>)itemList.Where(x => x.Fields[15].Value.ToString() == field.Value.ToString()).ToList();
у меня есть код, место для создания динамического запроса LINQ (выстраивание WHERE выражения) на основе полого поиска, предоставляемых из запроса JSON (я не включаю код для этого здесь, поскольку он слишком длинный, и не уверен, что он полностью уместен ... YET). Однако, как анализируются выражения, вы должны иметь возможность ссылаться на имя свойства для поиска против - что, конечно, неизвестно, так как это значение свойства Name.
So - Как изменить запрос, чтобы учесть, что имена полей, которые определяют параметры запроса, неизвестны заранее?
EDIT: Следующий блок кода показывает, что я хочу использовать (вернее, это будет работать с моим динамическим построителем запросов). Первая строка - это код, который отлично работает, если имя поля в классе определено так же, как имя поля, указанное в строке JSON. Вторая - одна из попыток, которые я предпринял при попытке получить свойство внутреннего имени поля коллекции.
foreach (KeyValuePair<string, object> field in queryFields)
{
itemList = itemList.Where<Bug>(field.Key, field.Value, (FilterOperation)StringEnum.Parse(typeof(FilterOperation), "eq"));
itemList = itemList.Where<Bug>(x => x.Fields.Any(y => y.Name == field.Key && y.Value == field.Value));
}
Есть ли причина, по которой вы не добавляете 'using System.Xml.Serialization' в начало этого cs-файла? Это затрудняет чтение кода. Если вы добавите этот оператор 'using', вы сможете удалить' System.Xml.Сериализация' из объявления атрибута. Например: '[XmlArrayAttribute (..)' вместо '[System.Xml.Serialization.XmlArrayAttribute (..)' – Odys
@odyodyodys: Согласовано. Для атрибутов вы также можете отбросить завершающий «Атрибут», как это видно на C#. – recursive
На самом деле - нет, нет причин. Обычно я делаю именно это, чтобы сделать вещи чище. :) –