【问题标题】:Dynamic SQL To Dynamic LINQ in VB.NET with MS SQL Server 2008VB.NET 中的动态 SQL 到动态 LINQ 与 MS SQL Server 2008
【发布时间】:2010-05-24 18:44:26
【问题描述】:

我害怕问这个问题,因为到目前为止,我了解到我必须在脑海中塞进很多新东西。尽管有所有类似的问题(以及各种各样的答案),但我认为我不会问,因为我已经阅读了裁缝来满足我的具体需求。

我需要使用 LINQ 表示以下查询:

声明@PurchasedInventoryItemID Int = 2
声明 @PurchasedInventorySectionID Int = 0
声明@PurchasedInventoryItem_PurchasingCategoryID Int = 3
声明 @PurchasedInventorySection_PurchasingCategoryID Int = 0
声明 @IsActive 位 = 1
声明@PropertyID Int = 2
声明 @PropertyValue nvarchar(1000) = 'Granny Smith'
--属性 1、属性 2、属性 3 ...

选择 O.PurchasedInventoryObjectID,
       O.PurchasedInventoryObjectName,
       O.PurchasedInventoryConjunctionID,
       O.总结,
       奥伯爵,
       O.PropertyCount,
       O.IsActive
FROM tblPurchasedInventoryObject 作为 O
INNER JOIN tblPurchasedInventoryConjunction As C ON C.PurchasedInventoryConjunctionID = O.PurchasedInventoryConjunctionID
INNER JOIN tblPurchasedInventoryItem 作为我在 I.PurchasedInventoryItemID = C.PurchasedInventoryItemID
INNER JOIN tblPurchasedInventorySection As S ON S.PurchasedInventorySectionID = C.PurchasedInventorySectionID
INNER JOIN tblPurchasedInventoryPropertyMap 作为 M ON M.PurchasedInventoryObjectID = O.PurchasedInventoryObjectID
INNER JOIN tblPropertyValue As V ON V.PropertyValueID = M.PropertyValueID

在哪里

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

现在,我知道 .NET 中的查询看起来不像这样,这是我在 SQL Design Studio 中的测试。自然会使用 VB.NET 变量来代替 SQL 局部变量。

我的问题是:“WHERE”之后的所有条件都是可选的。在这种情况下,可能会进行使用一个、一些、全部或不使用任何条件的查询。 V.PropertyID 和 V.Value 也可以出现任意次数。

在 VB.NET 中,我可以通过简单地连接字符串并使用循环附加“V.PropertyID/V.Value”条件来使这个查询变得足够简单。

我也可以用MS SQL做一个存储过程,很简单。

但是,我想使用 LINQ 来完成。

如果有人可以指导我,我将不胜感激。

【问题讨论】:

    标签: sql vb.net linq


    【解决方案1】:

    我通过字符串连接我的查询并使用 DataContext.ExecuteQuery 函数解决了这个问题:

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

    就像一个魅力,我什至可以更改数据并将其发布回数据库。尽管如此,它仍然感觉“倒退”,我愿意接受更好的方法来做到这一点。

    【讨论】:

    • 我认为动态 sql 将是您在这里的最佳选择。不过,我要做的是在存储过程中在服务器上构建它并使用 sp_executesql 来运行它。然后,您也许可以将 .ExecuteQuery() 调用简化为简单地调用存储过程名称。
    • 很高兴知道,因为这感觉很不对劲,所以有人告诉我这可能是我更好的选择。
    【解决方案2】:

    “在 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 skeet 的书 C# 中的第 238 页第 9.3 节 http://www.manning.com/skeet/ 和 Linq in Action 书 http://www.manning.com/marguerie/ 都对表达式树有很好的解释。

    【讨论】:

    • 太棒了!我知道我必须学习一些新东西,看到它们摆在我面前我松了一口气,而不是我不得不再次烧毁谷歌(当你不知道你在寻找什么时,这很糟糕)。非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-01-22
    • 2017-12-31
    • 2014-03-30
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 2011-04-10
    • 2017-04-30
    相关资源
    最近更新 更多