2012-03-07 73 views
1

在SQL服務器上,我創建了一個UDF。我們將其命名爲fnCompanyDetails。它從幾個聯合表中選擇一些關於公司的信息。 然後,將這個函數拖放到我的VB項目的新.dbml文件中。我想用它與LINQ。如下所示:使用LINQ to SQL和用戶定義的函數提交更改

Dim company = (From c In d.fnCompanyDetails(sap) 

        Select New With { 

     .Sap = c.txtSAP, 

     .CompanyName1 = c.txtCompanyName1, _ 

     .CompanyName2 = c.txtCompanyName2, _ 

     }) 

該查詢的結果顯示給用戶的表單。如果某些字段已更改,我想將更改發送到我的數據庫,但是如果我像UDF一樣從UDF中進行查詢,這是可能的嗎? 謝謝y

回答

1

不,不幸的是不可能以簡單的方式完成。 Linq-to-sql支持讀取爲自定義類型,但僅支持通過與表完全對應的實體類型進行更新。

通常情況下,最好的方法是在閱讀時務必閱讀純實體對象,以便更新它們。

另一種解決方案是從udf返回的數據中創建實體對象,然後將這些實體附加到上下文中。如果您先將實體附加到其原始狀態,然後在附加之後進行更改,則應該離開而沒有任何更改跟蹤問題。

+0

謝謝你,安德斯!使用這些實體對象 - 是否意味着此對象應該重複數據庫表的結構以便可以將更改上傳到表中?在這種情況下,我希望在SQL服務器上擁有所有數據庫邏輯(所有UDF,SP,視圖等)(我的意思是不要在代碼中使用LINQ構建它們)不會更好地處理數據集,比進入LINQ? – kzub 2012-03-07 13:14:34

+1

如果將表格拖放到設計器表面上,則會自動爲您創建實體對象。 linq-to-sql的意圖是將(幾乎)所有業務邏輯放在代碼中。如果您使用的是UDF或SP,那麼可能會有其他更好的選項。 – 2012-03-07 13:21:13

+0

在這種情況下,我不太瞭解LINQ的整個概念:(如果我必須選擇整個表格,然後可以將其映射到生成的類別並從那裏進行更新和插入) 我試圖創建實體對象「tblCompany」從我的UDF返回的結果中,但我得到了錯誤「顯式構造實體類型'tblCompany'在查詢中是不允許的」。所以這種方法似乎不工作:(我想我應該最好繼續使用古典的ADO.Net – kzub 2012-03-11 13:20:18