有没有办法构建一个QueryExpression,以便您可以动态处理未知数量的条件

Microsoft提供了类似于我在下面复制的示例,用于为QueryExpression创建多个条件。 有没有办法构建一个QueryExpression,以便您可以动态处理未知数量的条件? 在下面的Microsofts示例中,他们使用condition1,condition2等等…再次,我想知道是否有办法创建一个可以处理可变数量条件的更可重用的QueryExpression。 我知道整个事情可以在LINQ中完成,但我特别想确定是否可以使用QueryExpression完成。

// Create the query expression and set the entity to contact. QueryExpression query = new QueryExpression(); query.EntityName = "contact"; // Create a condition where the first name equals Joe. ConditionExpression condition1 = new ConditionExpression(); condition1.AttributeName = "firstname"; condition1.Operator = ConditionOperator.Equal; condition1.Values = new string[] { "Joe" }; // Create another condition where the first name equals John. ConditionExpression condition2 = new ConditionExpression(); condition2 .AttributeName = "firstname"; condition2 .Operator = ConditionOperator.Equal; condition2 .Values = new string[] { "John" }; 

因此,您可以以编程方式构建QueryExpressions,这可能有助于简化对象创建。 我要提出的唯一问题是,您可能会发现您的查询非常不同,因此很难创建通用函数来支持它们。

无论如何,这里有一个简单的例子,希望能让你开始。

  public static QueryExpression BuildQueryExpression(String entityName, ColumnSet columnSet, LogicalOperator logicalOperator, List conditions) { QueryExpression query = new QueryExpression(entityName); query.ColumnSet = columnSet; query.Criteria = new FilterExpression(logicalOperator); conditions.ForEach(c => query.Criteria.AddCondition(c)); return query; } 

用法:

  QueryExpression query = BuildQueryExpression("contact", new ColumnSet(true), LogicalOperator.And, new List() { new ConditionExpression("firstname", ConditionOperator.Equal, "James" ), new ConditionExpression("lastname", ConditionOperator.Equal, "Wood" ), }); 

我知道这是一个老问题,但我终于找到并优雅地编写了QueryExpression,并认为与社区分享会很好。

可以像这样编写相同的查询:

  FilterExpression _filter = new FilterExpression(LogicalOperator.And); _filter.AddCondition("firstname", ConditionOperator.Equal, "Joe"); _filter.AddCondition("firstname", ConditionOperator.Equal, "John"); dynamic _queryExpression = new QueryExpression { EntityName = Contact.EntityLogicalName, ColumnSet = new ColumnSet(true), Criteria = _filter }; 

LinqKit的PredicateBuilder提供了一组干净的扩展来管理这类问题。