我正在开发一个 ASP.NET Web Api 服务,其中一个控制器操作接受带有 0 个或多个 Key:Value 对的 JSON 字符串来搜索对象集合。因此,我不知道过滤集合的请求中将包含哪些字段名称。
现在,我的代码将通过基于提供的数据链接 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 请求得到我正在寻找的结果 - 但是该请求仅搜索一个字段和一个值,并且查询具有硬编码的正确字段的索引;) (仅供参考 - itemList 是之前创建的没有过滤的集合)
itemList = (List<Bug>)itemList.Where(x => x.Fields[15].Value.ToString() == field.Value.ToString()).ToList();
我确实有代码可以根据 JSON 请求提供的搜索字段创建动态 LINQ 查询(链接 WHERE 表达式)(我在这里不包括此代码,因为它太长了 - 并且不确定它是否完全相关...然而)。但是,解析表达式的方式需要能够引用要搜索的属性的名称——这当然是未知的,因为它是 Name 属性的值。
那么 - 如何修改查询以考虑到确定查询参数的字段名称事先是未知的?
编辑:以下代码块显示了我想要使用的内容(或者更确切地说,这将与我的动态查询生成器一起使用)。如果类中的字段名称定义为与 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));
}