使用Linq或Expression Tree编写动态查询动态查询的最佳方法

时间:2011-09-14 18:23:55

标签: c# linq linq-to-sql expression-trees

我正在寻找使用LINQ或表达式树编写查询的最佳方法,以根据动态输入返回动态结果。例如,考虑这个伪代码:

CREATE PROCEDURE Test
@Input      NVARCHAR(50)
AS
BEGIN
DECLARE @Query      NVARCHAR(100);
SET @Query=N'SELECT ' + @Input + ' FROM MyTable'

EXEC @Query
END

最好的方法是:

  1. 使用LINQ或表达式树
  2. 对此进行编码
  3. 使用LINQ to SQL
  4. 将其作为存储过程调用

    编辑1)

    考虑每个动态查询都不包含SELECT语句。例如,我最近编写了一个动态PIVOT个查询。所以我无法使用Dynamic LINQ

1 个答案:

答案 0 :(得分:1)

动态Linq?可能不是

我打算建议Dynamic Linq,但是你的“编辑”声明不适合你。

在这种情况下,我会说你的问题的答案是“没有最好的办法”。

Linq是最好的选择吗?

您的问题是要求Linq,特别是Linq to Sql,实现如何实现动态查询。

但请考虑Linq to Sql的用途。 Linq to SQL的主要好处是:

  1. 强类型查询(在编译时捕获错误)
  2. 结果很强。意思是好的预写类(在Linq到SQL的情况下,预生成)
  3. 现在,如果您正在执行“Select”语句并始终返回实际的映射表,那么您就没有理由不能使用动态Linq库。

    但是如果你正在返回任意非映射结果,那么使用LINQ没有意义,事实上它不会让你。

    DataContext.ExecuteQuery<T>(string query)
    

    DataContext类确实有ExecuteQuery<T>方法,但不幸的是you cannot return specify dynamic as the T :-(

    Linq to SQL和存储过程

    最后,LINQ to SQL可以映射到存储过程。因此,您可以拥有一个将查询作为参数的存储过程,就像您的示例一样。但是,我认为它在{* 1}}中可以得到与ExecuteQuery相同的限制,但是不要让我这样做。

    我将把它作为您的最终选项,并在Linq to SQL设计器中探索返回匿名,动态或映射类型的sproc。