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" };
答案 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提供了一组干净的扩展来管理这类问题。