在聚合表达式后重建Object属性

时间:2018-02-12 13:34:22

标签: c# linq

我正在构建一个过滤器系统来操作一个看起来像这样的简单集合:

public class ProcessedData
{
    public byte ProcessId { get; set; }
    public List<EventsData> EventsData { get; set; } = new List<EventsData>();
}

EventsData对象的id属性如下:

public class EventData
{
     public byte EventDataId { get; set; }
}

现在这个想法很简单,我有一个选定的ProcessId和EventId的集合,形式如下:

public List<byte> SelectedProcessFilter { get; set; }
public List<byte> SelectedEventFilter { get; set; }

所以我准备了聚合,其中条件的功能如下:

    public IEnumerable<ProcessedData> DataFilter(IEnumerable<ProcessedData> preprocessedData, Expression<Func<ProcessedData, bool>>[] filters)
    {
        if (filters != null)
        {
            preprocessedEvents = filters.Aggregate(preprocessedData, (current, filter) => current.Where(filter.Compile()));
        }

        return preprocessedEvents.ToList();
    }

现在我可以宣布条件类似的地方:

    private Expression<Func<ProcessedData, bool>>[] BuildPredicate()
    {
        var predicates = new List<Expression<Func<ProcessedData, bool>>>();

        if (SelectedProcessFilter != null && SelectedProcessFilter .Any())
        {
            predicates.Add(data => SelectedProcessFilter.Contains(data.ProcessId));
        }

        if (SelectedEventFilter != null && SelectedEventFilter.Any())
        {
            predicates.Add(data => SelectedEventFilter.Any(value => data.EventsData.Any(target => target.EventDataId == (byte)value.Value)));
        }

        return predicates.ToArray();
    }

用法很简单:

IEnumerable<ProcessedData> filteredPreprocessedData = service.DataFilter(preprocessedEvents, BuildPredicate());

并且基本上有效,但是当我对EventsDataId进行过滤时会有一个变量,它会检查这个值是否仅在该属性中,是否有可能以某种方式重建这样的属性,以便它只包含选定的EventId?

1 个答案:

答案 0 :(得分:0)

就像我现在所做的那样,我让NetMage建议并且只是制作了具有新属性值的对象副本。