LINQ预测条件和赋值

时间:2013-09-06 15:11:25

标签: c# linq expression

我正在尝试以动态方式定义需要应用于报表中数据的条件规则。我想要的是允许最终用户在配置中指定条件,然后在运行报告时编译和执行。

现在如果在代码中完成,我会有类似下面的代码。

      public int showTopEntries{get; set;}
. . . . 

showTopEntries = showTopEntries >= totalEntries ? totalEntries : showTopEntries;

但是,因为我希望用户在文本文件中提供此规则,在代码中读取和翻译它。如何将表格的字符串(下面)解析到上面的陈述中?

PropertyToSet =“showTopEntries”Condition =“showTopEntries> = totalEntries”ifTrue =“totalEntries”ifFalse =“showTopEntries”

最终,我希望用户能够以

的形式定义规则
<IfCondition>
    <WhenTrue><\WhenTrue>
    <WhenFalse>
        <IfCondition>
            <WhenTrue>
                <IfCondition>
                    . . . . .
                <\IfCondition>
            <\WhenTrue>
        <\IfCondition>
    <\WhenFalse>
<\IfCondition>

基本上,如果我有一个对象

公共类PersonDetail {   public String Name {get;组;}   public String Description {get;组;}   public String Age {get;组;}   public Boolean Alive {get;组;}   公共MaritalStatus MaritalStatus {get;组;}   公共地址{get;组;} }

我需要使用以下表达式

应用条件替换,例如子串,名称
  public static class  DetailExtender
     {
          public static void EvaluateConditionalFieldRule(this PersonDetail Detail, String PropertyToEvaluate, String ConditionalExpression, List<String> parameters, String IfTrue, String ifFalse)
          {
               var property =  Detail.GetType().GetProperties().Where(x=>x.Name == PropertyToEvaluate);
               if (property == null)
                    throw new InvalidDataException("Please specify a valid  Detail property name for the evaluation.");
               //put together the condition like so 

               if (Detail.AsQueryable().Where(ConditionalExpression, parameters).Count() > 0)
               {
                    // property.Value = IfTrue;
               }
               else
               {
                    property.Value = ifFalse;
               }

          }
}

提前感谢您的建议。

1 个答案:

答案 0 :(得分:1)

查看Dynamic LINQ,它提供的扩展程序可让您将string传递给Where(string)扩展程序,并为您动态构建谓词:

string filter = MyConfig.GetString("Condition");
// filtered string is "Condition ="showTopEntries >= totalEntries"
var filtered = dataSource.Where(filter);