Linq2Sql - 存储复杂的Linq查询以便将来动态执行 - 原始文本 - 可能吗?

时间:2009-10-13 05:02:23

标签: c# linq linq-to-sql

我对Linq2Sql有很多乐趣。表达树很棒,只是标准的Linq2Sql语法已经很有趣了。

我现在是我的应用程序的一部分,我必须以某种方式在数据库中存储查询,这些查询是针对使用相同数据库和相同表的不同客户定制的(好吧,查看,但你知道我的意思)。基本上,我不能硬编码任何东西,我必须保留查询语言的明文,以便有人可以写一个新的where子句类型查询。

所以,如果说明苛刻,请让我澄清一下:

在我们的应用程序的先前版本中,我们曾经使用原始SQL对db进行直接SQL调用。是啊。这很有趣,很脏,而且很有效。我们将有一个数据库表,其中包含不同的标准,如

(EventType = 6 and Total > 0)

或子查询样式

(EventType = 7 
AND Exists (
    select * 
    from events as e1 
        where events.EventType = e1.EventType 
        and e1.objectNumber = 89)
    )

(sql注入任何人?)

在Linq2Sql中,这更具挑战性。我可以在CLR中使所有这些查询没有问题,但能够传递动态,其中标准到Linq更具挑战性,特别是如果我想执行子查询(如上例)。

我有一些想法:

获取原始表达式并存储它 - 但我不知道如何获取原始文本表达式并将其反转回可执行文件到对象表达式。

编写一个类似SQl的语言,让它解析代码并生成Linq Expression - 哇,这可能很有趣

我很确定没有SomeIqueryable.Where("EventType = 6 and Total > 54")。我读到它在beta1中可用,但我现在看不到你怎么做。

var exp2 = context.POSDataEventView.Where("EmployeeNumber == @0", 8310); 

这对我来说是最简单的部署方式..我认为。

存储序列化的表达式 - 哇..这对于试图编写查询的用户来说会让人感到困惑 - 地狱,我不确定我甚至都可以输入它。

所以,我正在寻找一些关于如何以某种明文形式存储查询的想法,然后以某种方式对我的Linq2Sql对象执行它而不调用ExecuteSQL。我想使用LinqObjects。

P.S。如果有帮助,我正在使用pLinqo这个应用程序。它仍然是linq2sql。

提前致谢!

1 个答案:

答案 0 :(得分:3)

也许Dynamic LINQ Library(在MSDN样本中)会有帮助吗?

特别是,用法如下: .Where("Category=2 And UnitPrice>3"

这应该适用于任何IQueryable<T>源 - 包括LINQ到对象,只需在序列上调用.AsQueryable()(通常为IEnumerable<T>)。