2013-05-09 68 views
1

我有存储在一个字符串搜索条件:如何将搜索字符串转换为布尔条件?

string Searchstr = "(r.Value.Contains("PwC") || (r.Value.Contains("Canadian") && r.Value.Contains("thrive"))) || (r.Value.Contains("Banana") && r.Value.Contains("Gayle"))" 

我想用这一个if语句来检查值:

if(searchstr) 
{ 
    then do this.... 
} 

但如果应该有一个字符串searchstr布尔。

如何将它转换为布尔?

编辑:要求是动态给出搜索条件在以下格式的文本框 - “普华永道OR(加拿大和繁荣)”。 这将用于搜索XML文件。

因此,我已经加载了一个XML文件,并希望有一个LINQ Where条件的,我需要使用动态LINQ,但字符串不是在允许的,也是我有一些括号来处理。

的,我已经采取了从XML(标记值,我需要搜索)结果集

var selectedBook = from r in document.Root.Descendants("Archives").Elements("Headline").Elements("Para") 
            select r; 

,并会非常喜欢尝试像

思考:

var query=selectedbook.Where(searchstr) 

OR

if(searchstr){....then do this} 
+0

一个很好的方案,以取代操作数只是使用'bool',而不是'string'?或者是其他地方使用的标准 – Sayse 2013-05-09 07:59:11

+0

您将如何使用此搜索字符串?过滤数据表,数据视图,SQL查询? – Ric 2013-05-09 07:59:22

+0

字符串从哪里来? – 2013-05-09 08:06:15

回答

1

您需要做一些工作才能做到这一点,但这是可能的。

你应该看看在动态LINQ库。这允许您将LINQ条件(和其他子句)指定为字符串并像LINQ运算符一样执行它们。

开始对ScottGu的博客中解释,并按照链接: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

+0

我认为这不可能用于XML ......我在阅读动态LINQ示例时读过某处,它只能用于LINQ to SQL。不知道,但我试过了,但没有结果。 – 2013-05-09 11:31:12

+1

我认为最好的方法是构建一个[表达式树](http://msdn.microsoft.com/en-us/library/bb397951.aspx),我怀疑这是在做什么。不,您可以随时将表达式树编译成任何LINQ提供程序都可接受的普通函数。 – Rup 2013-05-09 12:37:06

0

我假设该字符串将只引用一组特定对象(rr.Value在这种情况下,例如 - 或任何你想要的东西,只要你事先知道)。如果是这样的话,那么:

  1. 创建一个delegate,是以对象(可以参考)作为参数 并返回一个bool,只要你想。
  2. 编程写入在存储器中定义查询 作为方法的主体(具有固定名称,优选地)一个小的C#源文件符合上述规定的委托。
  3. 使用CSharpCodeProvider类编译的程序集 与返回你想要的bool您的自定义功能。
  4. 从主程序运行动态编写和编译的代码。
+2

我认为表达式树会比CodeDom更简单。 – Rup 2013-05-09 12:39:06

0

那么你可能猜到它不会是直线前进,但在同一时间,因为它看起来

您可以执行一些步骤来得到你想要的东西并不难问题:

  1. 获取搜索表达式作为输入(例如,“普华永道OR(加拿大和成长)”)

  2. XElement返回true,并采取搜索标准编写扩展方法的输入。然后,您将能够使用

    var selectedBook = from r in 
    document.Root.Descendants("Archives").Elements("Headline").Elements("Para") 
    where r.SatisfiesCriteria(searchCriteria) 
    select r; 
    
  3. 编写解析searchCritera并将其存储在解析的格式分析器类。 (例如,您可以将其转换为后缀表示法)。这很容易,你可以使用standard algorithm这个。为了您的目的或者,将是运营商和普华永道等将是操作数。括号将作为解析的一部分被删除。

  4. 现在只需在您的扩展方法中调用此解析器,然后评估您获得的后缀表达式。这也可以通过标准stack based evaluation完成。事实上,如果你解析标准一次,然后只在哪里评估,那会更好。在评估你需要r.Value.Contains
相关问题