簡體   English   中英

LINQ to SQL調用存儲過程

[英]LINQ to SQL Calling stored procedure

我創建了一個小型測試Web應用程序,它使用LINQ to SQL。 我有ObjectDataSource和GridView。 GridView的Datasource是ObjectDataSource。 現在,這個ObjectDataSource使用一個名為MyTasks的類(如下所述的方法名稱:GetAllTask​​s())來填充SQL中使用Linq to SQL的Tasks表中的所有任務。 它調用存儲過程GetAllMyTasks()。

我有以下方法,完美的工作。

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    MyTasksDataContext db = new MyTasksDataContext();
    var tasks = db.GetAllMyTasks().Select(x => x);
    return tasks;
}

現在,如果我嘗試用以下代碼替換上面的代碼,只是為了利用關鍵字來創建Disposable MyTasksDataContext對象。 它給我一個錯誤,說“讀取器關閉時無效嘗試調用讀取”。 我在這里缺少什么嗎

 public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    using (MyTasksDataContext db = new MyTasksDataContext())
    {
        var tasks = db.GetAllMyTasks().Select(x => x);
        return tasks;
    }
}

有人可以請我幫我理由嗎? 我知道我的MyTasksDataContext對象正在調用它的dispose方法。

使用ToList()擴展方法盡早評估枚舉。

public static IEnumerable<GetAllMyTasksResult> GetAllTasks()
{
    using (MyTasksDataContext db = new MyTasksDataContext())
    {
        return db.GetAllMyTasks().ToList();
    }
}

這將導致枚舉發生在使用中,而不是在連接被處置之后。

枚舉需要在'using'塊內部發生的原因是LINQ使用了一種稱為'延遲執行'的東西來允許更強大的查詢編寫。

例如,如果您希望通用函數執行分頁,則可以將.Skip(30).Take(10)附加到結果的末尾,並且可以將該邏輯附加到生成的SQL中。

PS:
你說:

我知道我的MyTasksDataContext對象正在調用它的dispose方法。

那是錯誤的。

'using'塊正在調用Dispose方法,而不是對象本身。 而且,既然寫了使用, 就是在調用Dispose

正如John Gietzen所提到的,ToList()將解決您的直接問題。

這是必要的原因是因為延遲執行。 在迭代查詢之前,LINQ通常不會執行任何操作。 LINQ to SQL將調用存儲過程,但不會從結果中讀取行,直到迭代查詢。

暫無
暫無

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

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