2012-09-10 107 views
0

前一段时间,我询问了如何创建数据透视表。你们为我而来,我现在有一个存储过程创建了我的数据透视表并可以将结果存储在一个新表中。这些列是动态的,因此对于应用程序中的每个事务总是会有所不同。使用SQL函数将SQL Server存储过程转换为LINQ

我遇到的问题是我的应用程序是MVC并使用实体框架。由于数据库已建模,因此无法在具有动态列名称的飞行表上创建。在使用中,EF永远不会知道他们在那里,我的意见也不会。

它看起来像我需要将存储过程转换为LINQ语句,然后我可以从模型结束处理。

我的存储过程包含SQL Server STUFF函数,我不知道如何在LINQ语句中调用此函数。

SQL实例与SQL STUFF函数:

DECLARE @cols AS VARCHAR(MAX), 
@query AS VARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
          '],[' + convert(varchar(10), t2.date, 101) 
        FROM test AS t2 
        ORDER BY '],[' + convert(varchar(10), t2.date, 101) 
        FOR XML PATH('') 
       ), 1, 2, '') + ']' 


set @query = 'select name, ' + @cols + ' 
     from 
     ( 
      select name, date, cast(yesno as tinyint) as yesno 
      from test 
     ) x 
     pivot 
     ( 
      max(yesno) 
      for date in (' + @cols + ') 
     ) p' 


execute(@query) 

MSDN有以下方法:

[EdmFunctionAttribute("SqlServer", "STUFF")] 
public static string Stuff(
    string stringInput, 
    Nullable<int> start, 
    Nullable<int> length, 
    string stringReplacement 
) 

...但我不知道我在哪里把它和我如何使用它LINQ。

希望有道理,任何帮助非常感谢!

+0

东西功能仅用于撰写枢轴查询。它在你的EF模型中是无用的。在C#中,一个'string.Join'将会更容易。但这不是问题。问题是您无法捕获复杂类型的动态记录。 –

回答

0

您只需通过ADO调用存储过程,或者使用ExecuteStoreQuery<DbDataRecord>

+0

问题是'DbDataRecord'不是一个固定的结构。 –

相关问题