2010-05-24 124 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