2010-05-24 6 views
0

Je redoute de poser cette question, car avec ce que j'ai lu jusqu'à présent, je vais comprendre qu'il va falloir entasser de nouvelles choses dans ma tête. En dépit de toutes les questions similaires (et de la grande variété de réponses), je pensais que je ne demanderais rien d'autre que d'avoir lu aux tailleurs ce dont j'avais besoin.SQL dynamique à LINQ dynamique dans VB.NET avec MS SQL Server 2008

J'ai besoin de représenter la requête suivante en utilisant 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 

Maintenant, je sais que dans une requête .NET ne ressemble pas à cela, c'est mon test dans la conception SQL Studio. Naturellement, les variables VB.NET seront utilisées à la place des variables locales SQL.

Mon problème est le suivant: Toutes les conditions après "WHERE" sont facultatives. En ce qu'une requête pourrait être faite qui utilise une, certaines, toutes, ou aucune des conditions. V.PropertyID et V.Value peuvent également apparaître autant de fois que vous le souhaitez.

Dans VB.NET, je peux rendre cette requête assez simple en concaténant simplement des chaînes, et en utilisant une boucle pour ajouter les conditions "V.PropertyID/V.Value".

Je peux aussi faire une procédure stockée en MS SQL, ce qui est assez facile.

Cependant, je veux accomplir cela en utilisant LINQ.

Si quelqu'un pouvait me diriger, je serais très reconnaissant.

Répondre

1

J'ai travaillé autour de cette chaîne par-concaténer ma requête et en utilisant la fonction DataContext.ExecuteQuery:

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

fonctionne comme un charme, je ne peux même changer les données et l'afficher de nouveau à la base de données. Il se sent toujours "à l'envers", et je suis ouvert à de meilleures méthodes pour le faire.

+0

Je pense que le SQL dynamique sera malheureusement votre meilleur pari ici. Ce que je ferais, cependant, est de construire cela sur le serveur dans une procédure stockée et d'utiliser sp_executesql pour l'exécuter. Ensuite, vous pourrez peut-être simplifier votre appel .ExecuteQuery() en appelant simplement un nom de procédure stockée. –

+0

Bonne chose à savoir, puisque cela se sent si mal son re-assurer que quelqu'un me dise que c'est peut-être ma meilleure option. – instantmusic

0

« En VB.NET je peux faire cette requête assez facile par la concaténation des chaînes simplement, et en utilisant une boucle pour ajouter les « » conditions »

V.PropertyID/V.Value Vous pouvez faire la même chose en à l'aide dans la requête de mémoire, en construisant l'instruction de requête et filtrer « seulement quand il est nécessaire » à l'aide d'arbres d'expression Voici bases d'arbres d'expression http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx

ce qui est bon article sur le sujet: http://blogs.msdn.com/b/csharpfaq/archive/2009/09/14/generating-dynamic-methods-with-expression-trees-in-visual-studio-2010.aspx vous pouvez aussi se référer à la page 238 section 9.3 du livre de Jon Skeet C# en profondeur http://www.manning.com/skeet/, et Linq dans le livre d'action http://www.manning.com/marguerie/ ont tous une bonne explication des arbres d'expression.

+0

Génial! Je savais que je devais apprendre de nouvelles choses, et je suis soulagé de les voir disposés devant moi au lieu de devoir à nouveau brûler google (c'est dur quand on ne sait pas ce que l'on cherche). Merci beaucoup – instantmusic