Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ谓词条件和赋值_C#_Linq_Expression - Fatal编程技术网

C# LINQ谓词条件和赋值

C# LINQ谓词条件和赋值,c#,linq,expression,C#,Linq,Expression,我正在尝试一种动态的方法来定义需要应用于报表中数据的条件规则。我想要的是允许最终用户在配置中指定条件,然后在运行报告时编译和执行配置 现在,如果在代码中完成,我会有类似下面的代码 public int showTopEntries{get; set;} . . . . showTopEntries = showTopEntries >= totalEntries ? totalEntries : showTopEntries; 但是,因为我更希望用户在文本文件中提供此规则

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

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

      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>

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

公共类个人信息 { 公共字符串名称{get;set;} 公共字符串说明{get;set;} 公共字符串年龄{get;set;} 公共布尔活动{get;set;} 公共MaritalStatus MaritalStatus{get;set;} 公共广播地址{get;set;} }

我需要应用一个条件替换,比如子字符串,名称,使用下面的表达式

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

          }
}
publicstaticclassdetailextender
{
公共静态void evaluateConditionalFieldDrule(此人员详细信息、字符串属性toevaluate、字符串条件表达式、列表参数、字符串IfTrue、字符串ifFalse)
{
var property=Detail.GetType().GetProperties()。其中(x=>x.Name==PropertyToEvaluate);
if(属性==null)
抛出新的InvalidDataException(“请为评估指定有效的详细信息属性名称”);
//把这样的情况放在一起
if(Detail.AsQueryable().Where(ConditionalExpression,parameters).Count()>0)
{
//property.Value=IfTrue;
}
其他的
{
property.Value=ifFalse;
}
}
}
提前感谢您的建议。

请看,它提供的扩展允许您将
字符串
传递给
其中(字符串)
扩展,并为您动态构建谓词:

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

解析文件中的代码与LINQ有什么关系?那么这里允许的条目是什么?人们是否能够编写任意的C#代码,您是否限制了某些操作,这只是表达式,还是什么?这里还值得一提的是,执行最终用户以文本形式提供的代码时,非常非常非常安全。这是注入漏洞的缩影。这一漏洞的可能重复不是一个简单的要求。您基本上想要构建一种简单的脚本语言。对于最终用户报表生成,已经有许多工具可插入到您的应用程序中,这些工具具有更强大的表达式生成功能。本例中的数据源是一个具有多个属性的单个对象。我想知道是否有一个类可以简单地进行这种if-then-else评估。我希望能够灵活地嵌套我的条件并考虑这些条件。@Kobojunkie这里没有“简单性”的途径:将字符串转换为可以计算的表达式需要解析和动态映射。从本质上讲,我们需要重建C#编译器的一小部分,以便在运行时使用。Dynamic LINQ会帮你做的,好的。那么我如何将其应用于查询单个对象呢?@Kobojunkie使用
new[]{myObject}.Where(conditionString).SingleOrDefault()
。如果满足条件,它将返回对象,否则将返回
null
。本质上,我希望对查询返回的对象的属性进行字符串操作。格式化、重置等的方法。