我有一个模型对象列表和一个 xml,其中包含应根据该列表过滤的信息。我需要一个过滤器方法,它接受列表和 xml 并返回过滤后的列表。我需要它是通用的,以便它可以处理即ProductModel 列表或CustomerModel 列表。xml 可以具有如下所示的<descriptor>
元素或元素。<composite>
该FilterCompositionLogicalOperator
属性指示它是逻辑操作AND
还是逻辑OR
操作。FilterOperator
表示 eksampleIsEqualTo = 0
IsLessThan=1
等的枚举。
<?xml version="1.0" encoding="utf-8" ?>
<advanced FilterCompositionLogicalOperator="1">
<descriptor IsCaseSensitive="false" Member="SalesPrice" MemberType="System.Decimal" FilterOperator="5">800</descriptor>
<descriptor IsCaseSensitive="false" Member="CostPrice" MemberType="System.Decimal" FilterOperator="5">300</descriptor>
<composite FilterCompositionLogicalOperator="0">
<descriptor IsCaseSensitive="false" Member="CostPrice" MemberType="System.Decimal" FilterOperator="5">150</descriptor>
<descriptor IsCaseSensitive="false" Member="ProductId" MemberType="System.String" FilterOperator="0">400</descriptor>
</composite>
</advanced>
我尝试过这样的事情:
public List<IAdvancedFilterable> HandleXML(XElement xml, IEnumerable<IAdvancedFilterable> filterableList)
{
foreach (XElement element in xml.Elements())
{
// if composite, I call the method recursively giving it the composite element and list
// else I read all the attributes of the <descriptor> element. decide the type of the elementValue
// and then I call helper method 'Filter'
filtered = Filter(compareOpr, colNameAtt.Value, elementValue, list);
// Which filters the list according to this <descriptor> element using LINQ.
}
return filtered;
}
如何处理 OR 情况。AND 很容易 - 您只需根据每个过滤器进行过滤,<descriptor>
无需任何进一步考虑就可以了。
Filter 辅助方法打开FilterOperator
,例如:
case FilterOperator.IsLessThan:
if (elementValue.IsInt())
return list.Where(d => Convert.ToInt32(d.Source.GetColumnValue(columnName)) < Convert.ToInt32(elementValue));
if (elementValue.IsDecimal())
return list.Where(d => Convert.ToDecimal(d.Source.GetColumnValue(columnName)) < Convert.ToDecimal(elementValue));
break;
我的模型对象有一个GetColumnValue(columnName)
采用 columnName 并返回其值的方法。
知道如何有效地实现这一目标吗?在这种情况下 LINQ 是高性能的吗?是否有更好的选择以获得更好的性能?