在从LINQ to SQL检索数据时实现查询模式错误

时间:2013-02-01 09:13:29

标签: c# winforms linq-to-sql

我有一个用于从多个表中搜索的存储过程

`ALTER PROCEDURE [dbo].[rdsp_Srchfld]
(
@strFldlst as nvarchar(max),
@strTblnm as nvarchar(max),
@intSrchStyle as int,
@strcond1 as nvarchar(250),
@strCond2 as nvarchar(250)=null,
@strCond3 as nvarchar(300)
)
AS
BEGIN 
declare @strSql as varchar(7000)


--Process
set @strSql = 'select Distinct ' + @strFldlst  + ' from ' + @strTblnm 
IF @intSrchStyle = 0
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1  + ' = ' + '''' + @strCond2 + '''' + ' order by ' + '' + @strcond3 + ''
END
ELSE IF @intSrchStyle = 1
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1 + ' like ' + '''' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END



ELSE IF @intSrchStyle = 2 
BEGIN
    SET @strSql = @strSql + ' where ' + @strcond1  + ' like ' + '''' + '%' + @strCond2 + '%' + '''' + ' order by ' + '' + @strcond3 + ''
END

EXEC (@strSql)
END`

并将参数从LINQ传递给Sql

var rslt = from srch in custDC.rdsp_Srchfld(fldName, tblName, srchType, cond1, cond2, cond3) select srch;

现在我试图构建我的程序,我收到错误

Error   1   Could not find an implementation of the query pattern for source type 'int'.  'Select' not found.

为什么我收到错误,我该如何实现呢。

1 个答案:

答案 0 :(得分:2)

不要这样做。现在放弃你的方法。

首先阅读本文http://www.sommarskog.se/dynamic_sql.html

想一想为什么要创建Linq-to-SQL。看看它的继任者EF。

然后从支持ORM的已建立SQL Server为您的数据库建立模型。然后使用该模型为您提供良好的类型检查代码。让模型为您执行动态SQL。如果您有特殊要求或情况,ORM无法应对。然后考虑编写一个特殊的SP来处理它。


如果你要坚持你的方法,至少要了解SQL Injection attack是什么。了解sp_executesql并使用它。


如果Linq-to-SQL无法正确获取动态SQL,那么在客户端/应用程序层而不是SP中构建语句会更有意义。查看ExecuteQueryExecuteCommandDataContext方法。如果ORM太多,使用vanilla ADO.Net和SqlCommand都有其优点。