Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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_C# 3.0 - Fatal编程技术网

C# 如何将动态生成的搜索条件传递给LINQ

C# 如何将动态生成的搜索条件传递给LINQ,c#,linq,c#-3.0,C#,Linq,C# 3.0,我和林克有些麻烦。在我的程序中,我生成一个SQL搜索查询,如 select * from emp "where empId=1 and empname='abc'" (引用的文本在我的代码中生成)。我可以将生成的“where empId…”字符串文本传递给SQL查询 我想在LINQ中做同样的事情-我想传递这个字符串作为搜索条件,例如 var employee=from a in Employee.AsEnumerable() "where empId=1 and em

我和林克有些麻烦。在我的程序中,我生成一个SQL搜索查询,如

select * from emp "where empId=1 and empname='abc'"
(引用的文本在我的代码中生成)。我可以将生成的“where empId…”字符串文本传递给SQL查询

我想在LINQ中做同样的事情-我想传递这个字符串作为搜索条件,例如

var employee=from a in Employee.AsEnumerable()
             "where empId=1 and empname='abc'"
              select a;

这可能吗?提前感谢。

这很难,除非你打算雇佣:

  • 动态代码编译,或
  • 您愿意创建一个(非常复杂的)解析器来分析查询并调用相应的linq扩展方法
我个人对后者没有经验。对于前者,这有点棘手,如果不进行适当的缓存和安全检查,可能会出现严重错误。可执行代码注入非常危险


我认为如果可以预先确定查询的数量,最好使用不同的方法来过滤内容,如
Where()
,否则返回SQL。通常,除非用户手动输入查询,否则不需要执行此操作。

您可以使用基本查询(在您的示例中为Employee.AsEnumerable())并使用生成字符串的逻辑组成新查询。例如:

if(/*your logic for generating the string "where empId=1" here*/)
{
    query = query.Where(a.empId == 1);
}

if(/*your logic for generating the string "empname='abc'" here*/)
{
    query = query.Where(a.empname == "abc");
}

生成的查询对象将包含所有运算符。然而,正如其他人所说,这在一般情况下并非微不足道。对于SQL字符串来说,这也不是微不足道的。如果您只需要生成几个过滤器,它就可以工作,但如果您需要复杂的表达式,这将是一个问题。

如果您引用链接中的相关部分,或者将其应用于OPs案例,我认为这个答案会更有帮助。@Jens,您能简要解释一下吗,对不起,我是LinqWhere的新手,这将如何帮助OP从字符串中获取LinqWhere子句?