【问题标题】:Why is LINQ to SQL converting my string parameter to a column name?为什么 LINQ to SQL 将我的字符串参数转换为列名?
【发布时间】:2008-10-07 19:38:56
【问题描述】:

此 Linq to SQL 查询 ...

    Return (From t In Db.Concessions Where t.Country = "ga" Select t.ConcessionID, t.Title, t.Country)

...正在生成此 SQL:

SELECT [t0].[ConcessionID], [t0].[Title], [t0].[Country]
FROM [dbo].[Concessions] AS [t0]
WHERE [t0].[Country] = ga

...当我想要的是

WHERE [t0].[Country] = 'ga'

有什么想法吗?

【问题讨论】:

    标签: asp.net sql vb.net linq-to-sql


    【解决方案1】:

    大胆猜测....会是这样吗?

    t.Country = "ga"

    对比

    t.Country == "ga"

    【讨论】:

      【解决方案2】:

      实际上,它不应该生成其中任何一个。它将常量转换为参数,所以它是:

      SELECT [t0].[ConcessionID], [t0].[Title], [t0].[Country]
      FROM [dbo].[Concessions] AS [t0]
      WHERE [t0].[Country] = @p0
      

      @p0 作为 'ga' 传递。 你看到的会是这样吗?

      【讨论】:

      • 不,我直接从VS中的调试器复制并粘贴了执行SQL。
      • 我已经尽可能地复制了您的查询,使用 Northwind 数据库和 LINQPad。它产生了正确的 SQL。我唯一的建议是数据库本身或从它创建的 DataContext 一定有问题。
      【解决方案3】:

      回答

      Country 字段是 char(2);我将其更改为 nvarchar(50),从而解决了问题。这是 Linq to SQL 中的错误吗?

      【讨论】:

      • 在 VB 中,您是否需要像在 C# 中那样在字符中使用单引号?如 Country = 'GA' ?
      • @AugustLights:不,在 VB 中不是这样
      【解决方案4】:

      我不能确定这个特定的例子,但有一个已知的错误会导致与 nvarchar(1) 字段类似的问题。这可能是相关的。

      有一个关于它的bug report here,我也在我自己的网站上wrote about it

      【讨论】:

        【解决方案5】:

        选择应该是

        Select New With {t.ConcessionID, t.Title, t.Country}
        

        而不是

        Select t.ConcessionID, t.Title, t.Country
        

        您需要创建一个匿名类型的新实例来包含这些字段。

        【讨论】:

        • 不,它仍在生成完全相同的 SQL。
        • 我唯一的另一件事是仔细检查 Concession.Country 在 VB 和数据库中的类型都是正确的。
        • 它是正确的类型 - char(2) - 但将其更改为 nvarchar(50) 解决了问题。奇怪。
        猜你喜欢
        • 1970-01-01
        • 2020-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 2011-11-16
        相关资源
        最近更新 更多