簡體   English   中英

關於linq2sql的問題

[英]Question about linq2sql

我有一些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。

抱歉,您的問題有點誤解了,但我會保留我的最初評論

請記住,存儲過程返回的是結果集 ,而不是值。 除非您計算在return語句中返回的值。 因此,您需要一種類型來包裝返回的列和行。

如果您知道SP返回的行集映射到您的一種表類型,則可以將返回類型更改為表。 但是您將不能只返回“ int”。

請參閱此鏈接: http : //social.msdn.microsoft.com/forums/en-US/linqprojectgeneral/thread/1667a989-08a0-402c-9358-e4637406a75f (對不起,它已經在MSDN論壇上結束-並非SO:$),並且該鏈接的主題http://msdn.microsoft.com/zh-cn/library/bb386975.aspx

更新資料

L2S使用等效的SQL反射來計算SP返回的內容,以便自動生成結果。

如果SP不是SELECT ,或者僅包含RETURN ,則將為映射函數獲得基本的int返回類型。 如果SP使用IF語句分叉並相應地返回不同的結果,則這種事情可能會合法或錯誤地發生; L2S不可能找出可以滿足所有可能結果的單一收益類型,因此只能滿足其中之一。

正如@JohnOpincar在評論中提到的那樣,您在此處發布的SP是否實際上是您已映射的SP是否存在問號-因為名稱不相同? 我的猜測是您拖錯了SP,並且SP中只包含RETURN ,否則它將返回多個內容,並且L2S陷入困境。

更新2

好的-您已經更改了源代碼中的名稱。 我的建議是從L2S設計器中刪除SP(以及對該SP可能進行的任何其他手動嘗試),然后從Server Explorer中再次將其重新拖動,以確保它與從中拖動它的服務器/數據庫相同。 使用您發布的SQL,L2S非常簡單,因此絕對可以確定結果集是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM