繁体   English   中英

通过C#使用linq服务调用SQL Server存储过程

[英]Calling a SQL Server stored procedure with linq service through c#

我是Linq的新手,正在尝试将此SQL Server存储过程转换为Linq,我正在构建Silverlight业务应用程序,需要调用此过程以返回结果网格。

我有多个参数,用户可用来搜索特定的零件。 他们缩小了通过UI的搜索范围,当他们按下搜索按钮时,后面的代码将使用所有参数并将其发送给我的Linq服务,然后该服务需要调用存储过程。

这是存储过程。

ALTER PROCEDURE dbo.spSearchResults
@PieceType      nvarchar(6) =  '',
@FileType       nvarchar(3) = '',
@Market     nvarchar(6) = '',
@PieceNumber        nvarchar(6) = '',
@Header1    nvarchar(50) = '',
@Header2    nvarchar(50) = '',
@Header3    nvarchar(50) = '',
@Header4    nvarchar(50) = '',
@JobNumber      nvarchar(50)=' ',
@bShowInActive  BIT = 0,
@UDAC1      nvarchar(50) = '',
@UDAC2      nvarchar(50) = '',
@UDAC3      nvarchar(50) = '',
@UDAC4      nvarchar(50) = ''   
AS
BEGIN
SET NOCOUNT ON

SELECT J.* 
FROM Job J
  LEFT JOIN JobHeading H1 (NOLOCK) ON J.[JobNumber] =  H1.[JobID]
  LEFT JOIN JobHeading H2 (NOLOCK) ON J.[JobNumber] =  H2.[JobID]
  LEFT JOIN JobHeading H3 (NOLOCK) ON J.[JobNumber] =  H3.[JobID]
  LEFT JOIN JobHeading H4 (NOLOCK) ON J.[JobNumber] =  H4.[JobID]
  LEFT JOIN JobUDAC udac1 (NOLOCK) ON J.[JobNumber] = udac1.[JobID]
  LEFT JOIN JobUDAC udac2 (NOLOCK) ON J.[JobNumber] = udac2.[JobID]
  LEFT JOIN JobUDAC udac3 (NOLOCK) ON J.[JobNumber] = udac3.[JobID]
  LEFT JOIN JobUDAC udac4 (NOLOCK) ON J.[JobNumber] = udac4.[JobID]
WHERE ((@PieceType = '') OR (PieceType = @PieceType))
  AND ((@FileType = '') OR (FileType = @FileType))
  AND ((@Market = '') OR (Market = @Market))
  AND ((@PieceNumber = '') OR (PieceNumber = @PieceNumber))
  AND ((@JobNumber = '') OR (JobNumber = @JobNumber))
  AND (J.IsActive=1 OR @bShowInActive = 1)
  AND (((@Header1 = '' AND @Header2 = '' AND @Header3 = '' AND @Header4 = '') OR 
        H1.HeadingRowID = @Header1)
    OR (--@Header2=0 OR 
        H2.HeadingRowID = @Header2 )
    OR (--@Header3=0 OR 
        H3.HeadingRowID = @Header3)
    OR (--@Header4=0 OR 
        H4.HeadingRowID = @Header4))
  AND (((@UDAC1 = '' AND @UDAC2 = '' AND @UDAC3 = '' AND @UDAC4 = '') OR 
        udac1.UDACRowID = @UDAC1)
    OR (--@Header2=0 OR 
        udac2.UDACRowID = @UDAC2 )
    OR (--@Header3=0 OR 
        udac3.UDACRowID = @UDAC3)
    OR (--@Header4=0 OR 
        udac4.UDACRowID = @UDAC4))

在Linq中,我发现需要执行某些转换,这是我的尝试。

var query = from j in Job
                    join JobHeading H1 in Job on headingRowID1 equals H1
                    join JobHeading H2 in Job on headingRowID2 equals H2
                    join JobHeading H3 in Job on headingRowID3 equals H3
                    join JobHeading H4 in Job on headingRowID4 equals H4
                    join JobUDAC udac1 in Job on udacRowID1 equals udac1
                    join JobUDAC udac2 in Job on udacRowID2 equals udac2
                    join JobUDAC udac3 in Job on udacRowID3 equals udac3
                    join JobUDAC udac4 in Job on udacRowID4 equals udac4
                    join PieceType in db on piece equals PieceType
                    join JobFileType in db on filetype equals JobFileType
                    join Book in db on market equals Book
                    join PieceNumber in db on pieceNumber equals PieceNumber
                    join JobNumber in db on jobNumber equals JobNumber
                    join Job in db on FindJobs equals db
                    where ((piece = string.Empty) || (PieceType = piece))
                      && ((filetype = string.Empty) || (JobFileType = filetype))
                      && ((market = string.Empty) || (Book = market))
                      && ((pieceNumber = string.Empty) || (PieceNumber = pieceNumber))
                      && ((jobNumber = string.Empty) || (JobNumber = jobNumber))
                      && (showInActive = true)
                      && ((((headingRowID1 = string.Empty) + (headingRowID2 = string.Empty) + (headingRowID3 = string.Empty) + (headingRowID4 = string.Empty)) ||
                            H1.HeadingRowID = headingRowID1)
                        || (H2.HeadingRowID = headingRowID2)
                        || (H3.HeadingRowID = headingRowID3)
                        || (H4.HeadingRowID = headingRowID4))
                      && ((((udacRowID1 = string.Empty) + (udacRowID2 = string.Empty) + (udacRowID3 = string.Empty) + (udacRowID4 = string.Empty)) ||
                            udac1.UDACRowID = udacRowID1)
                        || (udac2.UDACRowID = udacRowID2)
                        || (udac3.UDACRowID = udacRowID3)
                        || (udac4.UDACRowID = udacRowID4))
                    select j.Job;
        return query;

但是,开头的“作业”出现错误,并说“找不到实现...找不到'加入'”有人可以帮助翻译吗? 还是提供一种更好的方法来调用带有后面代码的存储过程? 谢谢

您可以将存储过程添加到实体上下文中,然后将其作为方法调用。

为此,您必须将存储过程添加到实体模型。 您没有说如何建立模型或使用的是什么版本的EF,但是我想您可以继续从数据库更新模型并添加存储过程。

在模型中拥有SP后,必须将SP转换为功能导入。 您可以通过在模型浏览器中导航到存储过程,右键单击SP图标并选择“添加功能导入”来执行此操作。 由于您要返回复杂的结果集,因此建议您构建一个复杂类型,将其用作SP的结果类型。 要在“添加函数导入”对话框中创建复杂类型,请单击“获取列信息”按钮。 这将显示您SP的返回值,因此您可以通过单击“创建新的复杂类型”按钮来创建新的复杂类型。 给它起一个名字,然后单击“确定”。 现在,您的函数导入位于模型浏览器的“函数导入”下。

调用函数导入方法的方式是:

var result = context.spSearchResults(Your list of parameters...);

这将执行SP,并且“结果”应为您提供复杂类型的对象列表。

一些参考:

http://msdn.microsoft.com/en-us/library/bb896231.aspx

http://msdn.microsoft.com/en-us/library/ee534438.aspx

刚刚完成:添加复杂类型的另一种方法是:在模型浏览器中,导航到“复杂类型”,右键单击并选择“创建复杂类型”。 在那里,您必须定义一个复杂类型,该类型具有与SP结果集相同的属性(名称和类型)。 在对话框中,选择“返回的集合”中的“复杂”,

希望这可以帮助。

要使用linq调用存储过程,只需转到服务器资源管理器以连接数据库,然后选择“存储过程”文件夹,然后将其拖到dbml设计器文件中即可。 您将注意到在设计器中添加了一个方法。 然后只需实例化上下文并调用您的过程。 示例: 示例Linq StoredProcedures

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM