关于linq2sql的问题

时间:2011-04-12 12:48:52

标签: c# tsql linq-to-sql

我有一些linq2sql类的遗留代码。 DataContext类具有以下存储过程定义:

 [Function(Name="dbo.sp_Goods_SelectBySection")]
        public ISingleResult<sp_Goods_SelectBySectionResult> sp_Goods_SelectBySection([Parameter(Name="SectionId", DbType="Int")] System.Nullable<int> sectionId)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sectionId);
            return ((ISingleResult<sp_Goods_SelectBySectionResult>)(result.ReturnValue));
        }

但是当我尝试在我自己的项目中创建相同的过程时,设计者创建具有不同实现的过程:

[Function(Name="dbo.sp_Goods_SelectBySection")]
        public int sp_Goods_SelectBySection([Parameter(Name="SectionId", DbType="Int")] System.Nullable<int> sectionId)
        {
            IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), sectionId);
            return ((int)(result.ReturnValue));
        }

我无法更改方法属性中的类型。

这是存储过程的代码。

ALTER PROCEDURE [dbo].[sp_Goods_SelectBySection]
(
    @SectionId INT
)
AS
BEGIN

    SET NOCOUNT ON;

    SELECT 
        Goods.Id,
        Goods.[Name],
        TypeId,
        Makerid,
        Price,
        [Description],
        Term,
        Types.Name AS TypeName,
        Makers.Name AS MakerName,
        GoodsImage.SmallImageUrl AS MainImageUrl,
        Goods.IsDeleted,
        Goods.Rang
    FROM Goods 
         INNER JOIN Types ON (Types.Id = Goods.TypeId)
         INNER JOIN Makers ON (Makers.Id = Goods.MakerId)
         LEFT JOIN GoodsImage ON ( GoodsImage.GoodId = Goods.Id AND GoodsImage.IsMain = 1 AND GoodsImage.IsDeleted = 0 )
    WHERE 
        Types.SectionId = @SectionId
        AND Goods.IsDeleted  = 0
    ORDER BY Rang ASC       
END

为什么呢?我如何创建返回ISingleResult而不是int的过程?

注意我有很多这样的程序并且手工修改它们每个都不是我想的好主意。


我猜这是设计师的问题。因为我创建了新的测试项目,它运行正常。感谢所有帮助过我的人。特别是对Andras Zoltan。

1 个答案:

答案 0 :(得分:3)

很抱歉,稍微误解了你的问题,但我会保留我的初步意见

请记住,存储过程会返回结果集,而不是值;除非您计算return语句中返回的值。因此,您需要一个类型来包装返回的列和行。

如果您知道SP返回映射到某个表类型的行集,则可以将返回类型更改为表。但是你不能只返回'一个int'。

请参阅此链接:http://social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/1667a989-08a0-402c-9358-e4637406a75f(对不起它在MSDN论坛上结束 - 而不是SO:$)以及来自http://msdn.microsoft.com/en-us/library/bb386975.aspx的链接主题

更新

L2S使用等效的SQL反射来计算SP返回的内容,以便自动生成结果。

如果SP没有SELECT,或者其中只有RETURN,您将获得映射函数的基本int返回类型。如果SP使用IF语句来分叉并相应地返回不同的结果,那么这种事情可能合法地或错误地发生; L2S不可能找出能够满足所有可能结果的单一返回类型,因此它只会为其中一种提供丰富的效果。

正如@JohnOpincar在他的评论中提到的那样,你在这里张贴的SP是否实际上是你所映射的SP还有一个问号 - 因为名字不一样?我的猜测是你拖了错误的SP - 而且它只有一个RETURN,或者它返回了多个东西而且L2S已经开始了。

更新2

好的 - 所以你已经改变了源代码中的名字。我的建议是从L2S设计器中删除SP(以及您可能对此SP进行的任何其他手动尝试),然后从服务器资源管理器中再次将其拖回,确保它与您拖动它的服务器/数据库相同。使用您发布的SQL,L2S绝对能够找出结果集的内容,因为它非常简单。