2011-06-16 50 views
6

我在SQL Server數據庫中有一個存儲過程,它返回結果列表。此存儲過程公開在LINQ-to-SQL dbml文件中。然後我嘗試調用此存儲過程這樣:LINQ到SQL中的存儲過程

public List<MyObject> GetObjects() 
{ 
    List<MyObject> objects = new List<MyObject>(); 
    using (DatabaseDataContext context = new DatabaseDataContext()) 
    { 
    objects = context.GetObjectsFromDB(); // This is my problem line 
    } 
    return objects; 
} 

我的問題是,我不知道如何將存儲過程的結果轉換爲List<MyObject>context.GetObjectsFromDB返回System.Data.Linq.ISingleResult<sprocName>。如何將存儲過程的結果轉換爲強預定義類型的List?

謝謝!

+1

請出示代碼被用來調用存儲過程。 – 2011-06-16 13:11:54

+2

作爲一個方面說明:新增列表最初是不必要的(並且浪費),初始列表對象將被GCed。 – BrokenGlass 2011-06-16 13:23:58

回答

4

試試這個,

public List<MyObject> GetObjects() 
{ 

using (DatabaseDataContext context = new DatabaseDataContext()) 
{ 
var objects = context.GetObjectsFromDB(); 
return new List<MyObject>(objects); 
} 
} 

更新: 通過使用顯式類型轉換,可以這樣

public List<MyObject> GetObjects() 
{ 
using (DatabaseDataContext context = new DatabaseDataContext()) 
{ 
    List<MyObject> objects = (List<MyObject>)context.GetObjectsFromDB(); 
    return objects; 
} 
} 
+1

這是爲什麼工作? – 2011-06-16 15:51:34

+0

@Justin:這裏VAR隱式地將你的對象轉換爲慾望類型,編譯器會在運行時得到它。你也可以通過做明確的轉換來做到這一點,並且在你的代碼中你沒有定義任何轉換... – Syeda 2011-06-17 06:38:41

+0

啊,我明白你在做什麼。我被'列表對象=新列表();'在您的原始版本,我認爲是不必要的。你實際上可以用'return(列表)context.GetObjectsFromDB();'替換'using'塊中的所有內容,它可以正常工作。 – 2011-06-17 13:53:50

0

ISingleResult<T>繼承自IEnumerable<T>。只要'T'表示MyObject,您應該可以遍歷序列。如果'T'是一個不同的類型,我會在MyObject上放置一個構造函數,它接受數據庫類型並從中創建一個MyObject。

您是否嘗試過在SPROC調用之後刪除斷點以查看調試器對於返回的對象所說的內容?

0

可枚舉類也有,我通常使用這個ToList成員函數來完成。 http://msdn.microsoft.com/en-us/library/bb342261.aspx

此外,當使用Linq到Sql時,我總是檢查結果爲null。如果我期望列表,請在轉換爲列表之前檢查計數是否大於零。

public List<MyObject> GetObjects() 
{ 
    List<MyObject> objects = null; // no need to "new" here 
    using (DatabaseDataContext context = new DatabaseDataContext()) 
    { 
    var tmp = context.GetObjectsFromDB(); 
    if (tmp != null) 
    { 
     if (tmp.Count() > 0) 
     { 
     objects = (List<MyObject>)tmp.ToList(); 
     } 
    } 
    } 
    return objects; 
} 

同樣,如果你只希望一個結果,使用

myObject = (MyObject)tmp.ToSingle(); 

最後,你可能要考慮在try-catch塊包裝這個功能,趕上了SQLException並妥善處理錯誤。

我只提到由於開發應用程序 的經驗而導致的額外錯誤處理,如果您沒有附加的錯誤處理代碼,它們可能會崩潰!

0

我知道這是TOOOO晚,但....

從LINQ角度探討,業務提供商(不使用單結果輸出)將返回數據集,所以創造你必須從SP指定返回字段列表:

objects = context.GetObjectsFromDB().Select(x => x.MyObject); 

即由SP返回的字段的名稱,如

objects = context.GetObjectsFromDB().Select(x => x.Names); 
0

我有同樣的問題!

我的解決辦法是翻拍存儲過程由表變量替換時態表

DOESN'T AUTO MAP spAA_Result:

CREATE PROCEDURE spAA 
AS 
CREATE TABLE #TABLETMP (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM #TABLETMP 

AUTO MAP正確的類spBB_Result:

CREATE PROCEDURE spBB 
AS 
DECLARE @TABLETMP AS TABLE (ID INT, NAME varchar(50)) 
    ... 
SELECT * FROM @TABLETMP 
0

是什麼將工作如下:

List<string> listOfStrings = dbContext.spMyStoredProc().Select(x => x.Value).ToList<string>(); 

List<int> listOfInts = dbContext.spMyStoredProc().Select(x => x.Value).ToList<int>();