2010-05-24 88 views
0

我害怕問這個問題,因爲到目前爲止我所讀到的,我明白我將不得不將新東西塞進我的腦海。儘管存在所有類似的問題(以及各種各樣的答案),但我認爲我會一直沒有問過我已經閱讀了我所需要的具體足夠的裁縫。動態SQL動態SQL到MS.NET SQL Server 2008 VB.NET動態LINQ

我要代表使用LINQ以下查詢:

DECLARE @PurchasedInventoryItemID Int = 2 
DECLARE @PurchasedInventorySectionID Int = 0 
DECLARE @PurchasedInventoryItem_PurchasingCategoryID Int = 3 
DECLARE @PurchasedInventorySection_PurchasingCategoryID Int = 0 
DECLARE @IsActive Bit = 1 
DECLARE @PropertyID Int = 2 
DECLARE @PropertyValue nvarchar(1000) = 'Granny Smith' 
--Property1, Property2, Property3 ... 

SELECT O.PurchasedInventoryObjectID, 
     O.PurchasedInventoryObjectName, 
     O.PurchasedInventoryConjunctionID, 
     O.Summary, 
     O.Count, 
     O.PropertyCount, 
     O.IsActive 
FROM tblPurchasedInventoryObject As O 
INNER JOIN tblPurchasedInventoryConjunction As C ON C.PurchasedInventoryConjunctionID = O.PurchasedInventoryConjunctionID 
INNER JOIN tblPurchasedInventoryItem As I ON I.PurchasedInventoryItemID = C.PurchasedInventoryItemID 
INNER JOIN tblPurchasedInventorySection As S ON S.PurchasedInventorySectionID = C.PurchasedInventorySectionID 
INNER JOIN tblPurchasedInventoryPropertyMap as M ON M.PurchasedInventoryObjectID = O.PurchasedInventoryObjectID 
INNER JOIN tblPropertyValue As V ON V.PropertyValueID = M.PropertyValueID 

WHERE 

I.PurchasedInventoryItemID = @PurchasedInventoryItemID AND 
S.PurchasedInventorySectionID = @PurchasedInventorySectionID AND 
I.PurchasingCategoryID = @PurchasedInventoryItem_PurchasingCategoryID AND 
S.PurchasingCategoryID = @PurchasedInventorySection_PurchasingCategoryID AND 
O.IsActive = @IsActive AND 
V.PropertyID = @PropertyID AND 
V.Value = @PropertyValue 

現在,我知道,在.NET查詢犯規這個樣子,這是我在SQL設計工作室測試。自然VB.NET變量將被用來代替SQL本地變量。

我的問題是這樣的:「WHERE」之後的所有條件都是可選的。在這種情況下,查詢可能會使用一個,一些,全部或者沒有任何條件。 V.PropertyID和V.Value也可以出現任意次數。

在VB.NET中,我可以通過簡單地連接字符串,並使用循環來附加「V.PropertyID/V.Value」條件,使這個查詢變得足夠簡單。

我也可以在MS SQL中創建一個存儲過程,這很容易。

但是,我想用LINQ來完成這個任務。

如果有人能指導我,我會非常感激。

回答

1

我工作圍繞這個由字符串拼接我的查詢和使用DataContext.ExecuteQuery功能:

Dim res As IEnumerable(Of tblPurchasedInventoryObject) = pidc.ExecuteQuery(Of tblPurchasedInventoryObject)(query).ToList 

得好好的,我甚至可以更改數據,並張貼到數據庫。儘管如此,它仍然感覺「倒退」,並且對更好的方法開放。

+0

我認爲動態sql很不幸會成爲你最好的選擇。然而,我會做的是在存儲過程中在服務器上構建並使用sp_executesql來運行它。那麼你可能會簡化你的.ExecuteQuery()調用來簡單地調用存儲過程名稱。 – 2010-05-24 20:28:37

+0

好東西知道,因爲這感覺錯了,重新確保有人告訴我這可能是我更好的選擇。 – instantmusic 2010-05-24 20:51:39

0

「在VB.NET我可以讓這個查詢很容易通過簡單的連接字符串,並使用循環追加‘V.PropertyID/V.Value’條件」

您可以通過做同樣的事情使用存儲的查詢,通過建立查詢語句,然後篩選「只有當它需要」使用表達式目錄樹 這裏的表達式樹的基本 http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx

,這是關於這個問題的好文章:您還可以 http://blogs.msdn.com/b/csharpfaq/archive/2009/09/14/generating-dynamic-methods-with-expression-trees-in-visual-studio-2010.aspx 請參閱Jon雙向書中的第238頁第9.3節C#深入http://www.manning.com/skeet/,以及Linq in Action書籍http://www.manning.com/marguerie/都對錶達樹有很好的解釋。

+0

太棒了!我知道我必須學習一些新的東西,我很高興看到他們擺在我面前,而不是我必須再次燒掉谷歌(當你不知道你在尋找什麼時,它很粗糙)。非常感謝 – instantmusic 2010-05-27 21:30:24