2010-09-02 68 views
1

我有一个包含动态sql的存储过程以返回结果集。查询运行良好,但我无法通过Linq将其用于sql。看来Data Class设计者认为查询只包含一列(位置)而不是正确的数字。c#linq到包含动态sql的存储过程的sql

我猜测它是因为动态SQL意味着列在设计时不可用。查询是这样的:

set @query = 'select ' + char(13) + 
    'case when a.location is not null then upper(left(a.location, 1)) + right(a.location, len(a.location) - 1) else ''All'' end as Location' + char(13) + @strsql + 
    'group by ' + char(13) + 
    'rollup(location)' + char(13) 

其中@strsql是包含引用列的其余部分的其余查询字符串。

有谁知道一种方法来克服这个限制(除了不使用动态sql当然)?

感谢

回答

4

暂时与非动态语句,其中有列适当数量的替换您的SQL存储过程。将它添加到DBML文件&保存(重新生成C#代码)。将原始SQL替换为存储过程。

除非删除&将存储的proc重新添加到DBML文件,否则VisualStudio不应该再次查看存储过程本身。

/* 
set @query = 'select ' + char(13) + 'case when a.location is not null then 
    upper(left(a.location, 1)) + right(a.location, len(a.location) - 1) 
    else ''All'' end as Location' + char(13) + @strsql + 'group by ' 
    + char(13) + 'rollup(location)' + char(13) 
*/ 
select 'a' as Location, 'b' as othercol, 'c' as col3 

这当然假定strsql中的列数是固定的,并且使用了consisient名称。如果不是,那么你正在碰到C#的限制,而不是Linq。

+0

为响应欢呼 - 对不起,它需要一段时间才能回来 - 我的妻子刚刚生产我们的第二个儿子,所以一直有点waylaid ...不幸的是,列数不固定,这就是为什么他的查询是动态的。看起来可能唯一的方法是忘记关于linq并使用sqlclient。 – pilsdumps 2010-09-06 13:45:27

+0

感谢!您的解决方案不适用于OP,但这是我一直在寻找的。 – Otis 2011-03-21 21:29:26