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

时间:2012-09-25 21:17:38

标签: c# linq dynamics-crm

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" }; 

3 个答案:

答案 0 :(得分:2)

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

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

    public static QueryExpression BuildQueryExpression(String entityName, ColumnSet columnSet, LogicalOperator logicalOperator, List<ConditionExpression> 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<ConditionExpression>()
        {
            new ConditionExpression("firstname", ConditionOperator.Equal, "James" ),
            new ConditionExpression("lastname", ConditionOperator.Equal, "Wood" ),
        });

答案 1 :(得分:0)

我知道这是一个老问题,但我终于找到并优雅地编写了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
    };

答案 2 :(得分:0)

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