[英]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陷入困境。
好的-您已經更改了源代碼中的名稱。 我的建議是從L2S設計器中刪除SP(以及對該SP可能進行的任何其他手動嘗試),然后從Server Explorer中再次將其重新拖動,以確保它與從中拖動它的服務器/數據庫相同。 使用您發布的SQL,L2S非常簡單,因此絕對可以確定結果集是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.