C# 我自己的应用程序中的“Where”Linq功能

C# 我自己的应用程序中的“Where”Linq功能,c#,.net,linq-to-sql,C#,.net,Linq To Sql,我需要在自己的代码中具有Where Linq功能 让我解释一下:我们有一个应用程序,它允许用户编写所谓的用户代码,即C语言的代码,应用程序将获取这些代码,并在运行时编译和运行 在用户代码中,我需要能够指定SQL条件。一种特殊情况是日期列上的条件。我们可能有像[DateColumn]='1/1/2001'这样的条件,这些条件很容易实现,但是[DateColumn]=GetDate+1。在后一种情况下,我需要实现一个解析器来理解表达式。我不想盲目地向SQL发送用户输入的任何内容,以避免SQL注入 用

我需要在自己的代码中具有Where Linq功能

让我解释一下:我们有一个应用程序,它允许用户编写所谓的用户代码,即C语言的代码,应用程序将获取这些代码,并在运行时编译和运行

在用户代码中,我需要能够指定SQL条件。一种特殊情况是日期列上的条件。我们可能有像[DateColumn]='1/1/2001'这样的条件,这些条件很容易实现,但是[DateColumn]=GetDate+1。在后一种情况下,我需要实现一个解析器来理解表达式。我不想盲目地向SQL发送用户输入的任何内容,以避免SQL注入

用户最乐意编写类似Linq的查询,如下所示:

xxx.Where(field => field == new DateTime(2001, 1, 1));
xxx.Where(field => field == DateTime.Now.AddDays(1));
是否可以以任何方式利用Linq到SQL框架?我需要在后面生成SQL来进一步构造整个查询并将其发送到SQL Server

是否有任何第三方工具可以帮助我

我不需要整个IQueryable接口来组合、连接查询等。。即使有限制,也只能将System.Linq.Expressions.Expression转换为T-SQL

为SQL公开此转换功能的System.Linq.*命名空间是什么?也许我能从反射器得到一些提示


非常感谢。

我想你可以利用Linq的懒惰评估来实现这一点。如果我正确理解你的问题,我想你可以这样做

// Before user code:
var products = from p in db.products select p;

// Insert user-generated code here, such as i.e.
userProducts = products.Where(p => price < 1000);

// After user code:
for (var product in userProducts)
{
  Whatever(product);
}

由于linq是惰性的,在枚举“结果”(在本例中为userProducts)之前,不会向数据库发出实际的SQL查询。

SDK中有一个名为dynamic linq的示例代码

\CS 2008样本\LinqSamples\DynamicQuery

你可以做这样的事情:

Northwind db = new Northwind(connString); 
db.Log = Console.Out;

var query =
    db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
    OrderBy("CompanyName").
    Select("New(CompanyName as Name, Phone)");
另一种可能性是实现自定义Linq提供程序。一个很好的例子可以在任性的博客上找到。这个博客帮助我实现了自己的自定义提供者

public interface IQueryable : IEnumerable {       
    Type ElementType { get; }
    Expression Expression { get; }
    IQueryProvider Provider { get; }
}

public interface IQueryProvider {
    IQueryable CreateQuery(Expression expression);
    IQueryable<TElement> CreateQuery<TElement>(Expression expression);
    object Execute(Expression expression);
    TResult Execute<TResult>(Expression expression);
}

恕我直言,我认为你是在跳出煎锅,跳进火里。您不希望允许SQL注入,但您允许代码注入。C代码,即使是lambda,也会产生副作用


好吧,C4.0确实允许您动态编译代码。但您必须执行编译器质量分析,以防止用户做出愚蠢或恶意的行为。使用WHERE子句来防止SQL注入要简单得多。

实际上,除了从表达式到字符串t-SQL.Hmm的转换机制之外,我不需要其他任何东西,这不是我真正需要的。我只需要一种快速转换表达式=>T-SQL字符串的方法。嗯,也许您需要编写一个自定义Linq Proivder。这里有一些非常好的博客。我的自定义linq提供程序也使用了它们。是的,我开始认为这是唯一的办法。不幸的是,我没有编写提供商的经验,这就是为什么我希望有一些第三方代码:DArthur,如果你愿意,重写你关于IQToolkit和任性博客的评论作为答案,我将把它标记为解决方案。我所说的应用程序是一个大型应用程序,有几层安全强制措施,以确保它不会以恶意的方式运行。代码是在沙箱中运行的,只有一小部分管理员有权编写用户代码等。因此,代码注入是经过设计的。我为什么需要这个功能以及所有可能的安全影响都无关紧要,但我的问题是如何做到这一点。我知道我可以为此创建自己的QueryProvider,但我一直在寻找最简单、最受测试的方法。。。。实际上,SQL注入不是一个问题。我几乎可以相信用户不会编写“drop table”命令,但更重要的是不要引诱他们去搅乱编写SQL代码的系统的底层实现。这是关于提供简单的API来创建强大的过滤器。我理解。无论如何,我认为您不应该直接向用户公开SQL或C。如果您在用户和数据之间放置了一些抽象UI层,那么无论您是将抽象转换为SQL还是C,都是一个实现细节。在后一种情况下,我相信.NET会在4.0或3.0中公开编译器。某些内容。以下库看起来很有希望:。